From 875cd839a3fe1efddd284433868449add3b0b82a Mon Sep 17 00:00:00 2001 From: sphoorthi Date: Fri, 5 Mar 2021 17:34:49 +0530 Subject: [PATCH] new E2AP and E2SMKPM files Change-Id: Ib4fc1f66899fe6ff7db8da8bc2ac24bda16a8207 Signed-off-by: sphoorthi --- build/common/asn_e2smkpm.mak | 49 + build/odu/makefile | 5 + src/codec_utils/E2AP/CauseE2.c | 4 +- src/codec_utils/E2AP/CauseE2.h | 4 +- src/codec_utils/E2AP/CauseMisc.c | 4 +- src/codec_utils/E2AP/CauseMisc.h | 4 +- src/codec_utils/E2AP/CauseProtocol.c | 4 +- src/codec_utils/E2AP/CauseProtocol.h | 4 +- src/codec_utils/E2AP/CauseRIC.c | 4 +- src/codec_utils/E2AP/CauseRIC.h | 4 +- src/codec_utils/E2AP/CauseRICservice.c | 4 +- src/codec_utils/E2AP/CauseRICservice.h | 4 +- src/codec_utils/E2AP/CauseTransport.c | 4 +- src/codec_utils/E2AP/CauseTransport.h | 4 +- .../E2AP/CriticalityDiagnostics-IE-ItemE2.c | 4 +- .../E2AP/CriticalityDiagnostics-IE-ItemE2.h | 4 +- .../E2AP/CriticalityDiagnostics-IE-ListE2.c | 4 +- .../E2AP/CriticalityDiagnostics-IE-ListE2.h | 4 +- src/codec_utils/E2AP/CriticalityDiagnosticsE2.c | 4 +- src/codec_utils/E2AP/CriticalityDiagnosticsE2.h | 4 +- src/codec_utils/E2AP/CriticalityE2.c | 4 +- src/codec_utils/E2AP/CriticalityE2.h | 4 +- src/codec_utils/E2AP/E2AP-PDU.c | 4 +- src/codec_utils/E2AP/E2AP-PDU.h | 7 +- src/codec_utils/E2AP/E2setupFailure.c | 6 +- src/codec_utils/E2AP/E2setupFailure.h | 6 +- src/codec_utils/E2AP/E2setupRequest.c | 6 +- src/codec_utils/E2AP/E2setupRequest.h | 6 +- src/codec_utils/E2AP/E2setupResponse.c | 6 +- src/codec_utils/E2AP/E2setupResponse.h | 6 +- src/codec_utils/E2AP/ENB-ID-Choice.c | 4 +- src/codec_utils/E2AP/ENB-ID-Choice.h | 4 +- src/codec_utils/E2AP/ENB-ID.c | 4 +- src/codec_utils/E2AP/ENB-ID.h | 4 +- src/codec_utils/E2AP/ENGNB-ID.c | 4 +- src/codec_utils/E2AP/ENGNB-ID.h | 4 +- src/codec_utils/E2AP/ErrorIndicationE2.c | 6 +- src/codec_utils/E2AP/ErrorIndicationE2.h | 6 +- src/codec_utils/E2AP/GNB-CU-UP-ID.c | 4 +- src/codec_utils/E2AP/GNB-CU-UP-ID.h | 4 +- src/codec_utils/E2AP/GNB-DU-IDE2.c | 4 +- src/codec_utils/E2AP/GNB-DU-IDE2.h | 4 +- src/codec_utils/E2AP/GNB-ID-Choice.c | 4 +- src/codec_utils/E2AP/GNB-ID-Choice.h | 4 +- src/codec_utils/E2AP/GlobalE2node-ID.c | 4 +- src/codec_utils/E2AP/GlobalE2node-ID.h | 4 +- src/codec_utils/E2AP/GlobalE2node-eNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalE2node-eNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalE2node-gNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalE2node-gNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalENB-ID.c | 4 +- src/codec_utils/E2AP/GlobalENB-ID.h | 4 +- src/codec_utils/E2AP/GlobalRIC-ID.c | 4 +- src/codec_utils/E2AP/GlobalRIC-ID.h | 4 +- src/codec_utils/E2AP/GlobalenGNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalenGNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalgNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalgNB-ID.h | 4 +- src/codec_utils/E2AP/GlobalngeNB-ID.c | 4 +- src/codec_utils/E2AP/GlobalngeNB-ID.h | 4 +- src/codec_utils/E2AP/InitiatingMessageE2.c | 4 +- src/codec_utils/E2AP/InitiatingMessageE2.h | 4 +- src/codec_utils/E2AP/Makefile.am.libasncodec | 554 +- src/codec_utils/E2AP/PLMN-IdentityE2.c | 4 +- src/codec_utils/E2AP/PLMN-IdentityE2.h | 4 +- src/codec_utils/E2AP/PresenceE2.c | 4 +- src/codec_utils/E2AP/PresenceE2.h | 4 +- src/codec_utils/E2AP/ProcedureCodeE2.c | 4 +- src/codec_utils/E2AP/ProcedureCodeE2.h | 4 +- src/codec_utils/E2AP/ProtocolIE-ContainerE2.c | 684 +- src/codec_utils/E2AP/ProtocolIE-ContainerE2.h | 244 +- src/codec_utils/E2AP/ProtocolIE-ContainerList.c | 4 +- src/codec_utils/E2AP/ProtocolIE-ContainerList.h | 4 +- src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.c | 4 +- src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.h | 4 +- .../E2AP/ProtocolIE-ContainerPairList.c | 4 +- .../E2AP/ProtocolIE-ContainerPairList.h | 4 +- src/codec_utils/E2AP/ProtocolIE-FieldE2.c | 4 +- src/codec_utils/E2AP/ProtocolIE-FieldE2.h | 4 +- src/codec_utils/E2AP/ProtocolIE-FieldPairE2.c | 4 +- src/codec_utils/E2AP/ProtocolIE-FieldPairE2.h | 4 +- src/codec_utils/E2AP/ProtocolIE-IDE2.c | 4 +- src/codec_utils/E2AP/ProtocolIE-IDE2.h | 4 +- .../E2AP/ProtocolIE-SingleContainerE2.c | 100 +- .../E2AP/ProtocolIE-SingleContainerE2.h | 184 +- src/codec_utils/E2AP/RANfunction-Item.c | 4 +- src/codec_utils/E2AP/RANfunction-Item.h | 4 +- src/codec_utils/E2AP/RANfunctionDefinition.c | 4 +- src/codec_utils/E2AP/RANfunctionDefinition.h | 4 +- src/codec_utils/E2AP/RANfunctionID-Item.c | 4 +- src/codec_utils/E2AP/RANfunctionID-Item.h | 4 +- src/codec_utils/E2AP/RANfunctionID.c | 4 +- src/codec_utils/E2AP/RANfunctionID.h | 4 +- src/codec_utils/E2AP/RANfunctionIDcause-Item.c | 4 +- src/codec_utils/E2AP/RANfunctionIDcause-Item.h | 4 +- src/codec_utils/E2AP/RANfunctionRevision.c | 4 +- src/codec_utils/E2AP/RANfunctionRevision.h | 4 +- src/codec_utils/E2AP/RANfunctions-List.c | 6 +- src/codec_utils/E2AP/RANfunctions-List.h | 7 +- src/codec_utils/E2AP/RANfunctionsID-List.c | 6 +- src/codec_utils/E2AP/RANfunctionsID-List.h | 6 +- src/codec_utils/E2AP/RANfunctionsIDcause-List.c | 6 +- src/codec_utils/E2AP/RANfunctionsIDcause-List.h | 6 +- src/codec_utils/E2AP/RICaction-Admitted-Item.c | 4 +- src/codec_utils/E2AP/RICaction-Admitted-Item.h | 4 +- src/codec_utils/E2AP/RICaction-Admitted-List.c | 6 +- src/codec_utils/E2AP/RICaction-Admitted-List.h | 6 +- src/codec_utils/E2AP/RICaction-NotAdmitted-Item.c | 4 +- src/codec_utils/E2AP/RICaction-NotAdmitted-Item.h | 4 +- src/codec_utils/E2AP/RICaction-NotAdmitted-List.c | 6 +- src/codec_utils/E2AP/RICaction-NotAdmitted-List.h | 4 +- src/codec_utils/E2AP/RICaction-ToBeSetup-Item.c | 4 +- src/codec_utils/E2AP/RICaction-ToBeSetup-Item.h | 4 +- src/codec_utils/E2AP/RICactionDefinition.c | 4 +- src/codec_utils/E2AP/RICactionDefinition.h | 4 +- src/codec_utils/E2AP/RICactionID.c | 4 +- src/codec_utils/E2AP/RICactionID.h | 4 +- src/codec_utils/E2AP/RICactionType.c | 4 +- src/codec_utils/E2AP/RICactionType.h | 4 +- src/codec_utils/E2AP/RICactions-ToBeSetup-List.c | 6 +- src/codec_utils/E2AP/RICactions-ToBeSetup-List.h | 6 +- src/codec_utils/E2AP/RICcallProcessID.c | 4 +- src/codec_utils/E2AP/RICcallProcessID.h | 4 +- src/codec_utils/E2AP/RICcontrolAckRequest.c | 4 +- src/codec_utils/E2AP/RICcontrolAckRequest.h | 4 +- src/codec_utils/E2AP/RICcontrolAcknowledge.c | 6 +- src/codec_utils/E2AP/RICcontrolAcknowledge.h | 6 +- src/codec_utils/E2AP/RICcontrolFailure.c | 6 +- src/codec_utils/E2AP/RICcontrolFailure.h | 6 +- src/codec_utils/E2AP/RICcontrolHeader.c | 4 +- src/codec_utils/E2AP/RICcontrolHeader.h | 4 +- src/codec_utils/E2AP/RICcontrolMessage.c | 4 +- src/codec_utils/E2AP/RICcontrolMessage.h | 4 +- src/codec_utils/E2AP/RICcontrolOutcome.c | 4 +- src/codec_utils/E2AP/RICcontrolOutcome.h | 4 +- src/codec_utils/E2AP/RICcontrolRequest.c | 6 +- src/codec_utils/E2AP/RICcontrolRequest.h | 6 +- src/codec_utils/E2AP/RICcontrolStatus.c | 4 +- src/codec_utils/E2AP/RICcontrolStatus.h | 4 +- src/codec_utils/E2AP/RICeventTriggerDefinition.c | 4 +- src/codec_utils/E2AP/RICeventTriggerDefinition.h | 4 +- src/codec_utils/E2AP/RICindication.c | 6 +- src/codec_utils/E2AP/RICindication.h | 6 +- src/codec_utils/E2AP/RICindicationHeader.c | 4 +- src/codec_utils/E2AP/RICindicationHeader.h | 4 +- src/codec_utils/E2AP/RICindicationMessage.c | 4 +- src/codec_utils/E2AP/RICindicationMessage.h | 4 +- src/codec_utils/E2AP/RICindicationSN.c | 4 +- src/codec_utils/E2AP/RICindicationSN.h | 4 +- src/codec_utils/E2AP/RICindicationType.c | 4 +- src/codec_utils/E2AP/RICindicationType.h | 4 +- src/codec_utils/E2AP/RICrequestID.c | 4 +- src/codec_utils/E2AP/RICrequestID.h | 4 +- src/codec_utils/E2AP/RICserviceQuery.c | 6 +- src/codec_utils/E2AP/RICserviceQuery.h | 6 +- src/codec_utils/E2AP/RICserviceUpdate.c | 6 +- src/codec_utils/E2AP/RICserviceUpdate.h | 6 +- src/codec_utils/E2AP/RICserviceUpdateAcknowledge.c | 6 +- src/codec_utils/E2AP/RICserviceUpdateAcknowledge.h | 6 +- src/codec_utils/E2AP/RICserviceUpdateFailure.c | 6 +- src/codec_utils/E2AP/RICserviceUpdateFailure.h | 6 +- .../E2AP/RICsubscriptionDeleteFailure.c | 6 +- .../E2AP/RICsubscriptionDeleteFailure.h | 6 +- .../E2AP/RICsubscriptionDeleteRequest.c | 6 +- .../E2AP/RICsubscriptionDeleteRequest.h | 6 +- .../E2AP/RICsubscriptionDeleteResponse.c | 6 +- .../E2AP/RICsubscriptionDeleteResponse.h | 6 +- src/codec_utils/E2AP/RICsubscriptionDetails.c | 4 +- src/codec_utils/E2AP/RICsubscriptionDetails.h | 4 +- src/codec_utils/E2AP/RICsubscriptionFailure.c | 6 +- src/codec_utils/E2AP/RICsubscriptionFailure.h | 6 +- src/codec_utils/E2AP/RICsubscriptionRequest.c | 6 +- src/codec_utils/E2AP/RICsubscriptionRequest.h | 6 +- src/codec_utils/E2AP/RICsubscriptionResponse.c | 6 +- src/codec_utils/E2AP/RICsubscriptionResponse.h | 6 +- src/codec_utils/E2AP/RICsubsequentAction.c | 4 +- src/codec_utils/E2AP/RICsubsequentAction.h | 4 +- src/codec_utils/E2AP/RICsubsequentActionType.c | 4 +- src/codec_utils/E2AP/RICsubsequentActionType.h | 4 +- src/codec_utils/E2AP/RICtimeToWait.c | 4 +- src/codec_utils/E2AP/RICtimeToWait.h | 4 +- src/codec_utils/E2AP/ResetRequest.c | 6 +- src/codec_utils/E2AP/ResetRequest.h | 6 +- src/codec_utils/E2AP/ResetResponse.c | 6 +- src/codec_utils/E2AP/ResetResponse.h | 6 +- src/codec_utils/E2AP/SuccessfulOutcomeE2.c | 4 +- src/codec_utils/E2AP/SuccessfulOutcomeE2.h | 4 +- src/codec_utils/E2AP/TimeToWaitE2.c | 4 +- src/codec_utils/E2AP/TimeToWaitE2.h | 4 +- src/codec_utils/E2AP/TriggeringMessageE2.c | 4 +- src/codec_utils/E2AP/TriggeringMessageE2.h | 4 +- src/codec_utils/E2AP/TypeOfErrorE2.c | 4 +- src/codec_utils/E2AP/TypeOfErrorE2.h | 4 +- src/codec_utils/E2AP/UnsuccessfulOutcomeE2.c | 4 +- src/codec_utils/E2AP/UnsuccessfulOutcomeE2.h | 4 +- src/codec_utils/E2AP/e2ap | Bin 523240 -> 523248 bytes src/codec_utils/E2AP_MASTER/CauseE2.c | 95 + src/codec_utils/E2AP_MASTER/CauseE2.h | 68 + src/codec_utils/E2AP_MASTER/CauseMisc.c | 62 + src/codec_utils/E2AP_MASTER/CauseMisc.h | 58 + src/codec_utils/E2AP_MASTER/CauseProtocol.c | 68 + src/codec_utils/E2AP_MASTER/CauseProtocol.h | 61 + src/codec_utils/E2AP_MASTER/CauseRIC.c | 76 + src/codec_utils/E2AP_MASTER/CauseRIC.h | 65 + src/codec_utils/E2AP_MASTER/CauseRICservice.c | 60 + src/codec_utils/E2AP_MASTER/CauseRICservice.h | 57 + src/codec_utils/E2AP_MASTER/CauseTransport.c | 58 + src/codec_utils/E2AP_MASTER/CauseTransport.h | 56 + .../E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.c | 70 + .../E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.h | 48 + .../E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.c | 53 + .../E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.h | 44 + .../E2AP_MASTER/CriticalityDiagnosticsE2.c | 94 + .../E2AP_MASTER/CriticalityDiagnosticsE2.h | 52 + src/codec_utils/E2AP_MASTER/CriticalityE2.c | 58 + src/codec_utils/E2AP_MASTER/CriticalityE2.h | 54 + src/codec_utils/E2AP_MASTER/E2AP-PDU.c | 78 + src/codec_utils/E2AP_MASTER/E2AP-PDU.h | 64 + src/codec_utils/{E2AP => E2AP_MASTER}/E2AP.asn1 | 0 src/codec_utils/E2AP_MASTER/E2setupFailure.c | 50 + src/codec_utils/E2AP_MASTER/E2setupFailure.h | 44 + src/codec_utils/E2AP_MASTER/E2setupRequest.c | 50 + src/codec_utils/E2AP_MASTER/E2setupRequest.h | 44 + src/codec_utils/E2AP_MASTER/E2setupResponse.c | 50 + src/codec_utils/E2AP_MASTER/E2setupResponse.h | 44 + src/codec_utils/E2AP_MASTER/ENB-ID-Choice.c | 192 + src/codec_utils/E2AP_MASTER/ENB-ID-Choice.h | 60 + src/codec_utils/E2AP_MASTER/ENB-ID.c | 241 + src/codec_utils/E2AP_MASTER/ENB-ID.h | 61 + src/codec_utils/E2AP_MASTER/ENGNB-ID.c | 94 + src/codec_utils/E2AP_MASTER/ENGNB-ID.h | 56 + src/codec_utils/E2AP_MASTER/ErrorIndicationE2.c | 50 + src/codec_utils/E2AP_MASTER/ErrorIndicationE2.h | 44 + src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.c | 70 + src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.h | 46 + src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.c | 70 + src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.h | 46 + src/codec_utils/E2AP_MASTER/GNB-ID-Choice.c | 94 + src/codec_utils/E2AP_MASTER/GNB-ID-Choice.h | 56 + src/codec_utils/E2AP_MASTER/GlobalE2node-ID.c | 89 + src/codec_utils/E2AP_MASTER/GlobalE2node-ID.h | 64 + src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.c | 50 + src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.h | 44 + .../E2AP_MASTER/GlobalE2node-en-gNB-ID.c | 50 + .../E2AP_MASTER/GlobalE2node-en-gNB-ID.h | 44 + src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.c | 72 + src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.h | 48 + .../E2AP_MASTER/GlobalE2node-ng-eNB-ID.c | 50 + .../E2AP_MASTER/GlobalE2node-ng-eNB-ID.h | 44 + src/codec_utils/E2AP_MASTER/GlobalENB-ID.c | 60 + src/codec_utils/E2AP_MASTER/GlobalENB-ID.h | 46 + src/codec_utils/E2AP_MASTER/GlobalRIC-ID.c | 99 + src/codec_utils/E2AP_MASTER/GlobalRIC-ID.h | 44 + src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.c | 60 + src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.h | 46 + src/codec_utils/E2AP_MASTER/GlobalgNB-ID.c | 60 + src/codec_utils/E2AP_MASTER/GlobalgNB-ID.h | 46 + src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.c | 60 + src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.h | 46 + src/codec_utils/E2AP_MASTER/InitiatingMessageE2.c | 398 ++ src/codec_utils/E2AP_MASTER/InitiatingMessageE2.h | 97 + .../E2AP_MASTER/Makefile.am.libasncodec | 288 + src/codec_utils/E2AP_MASTER/NativeEnumerated.c | 367 + src/codec_utils/E2AP_MASTER/NativeEnumerated.h | 45 + src/codec_utils/E2AP_MASTER/NativeEnumerated_oer.c | 149 + src/codec_utils/E2AP_MASTER/NativeInteger.c | 550 ++ src/codec_utils/E2AP_MASTER/NativeInteger.h | 46 + src/codec_utils/E2AP_MASTER/NativeInteger_oer.c | 99 + src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.c | 65 + src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.h | 46 + src/codec_utils/E2AP_MASTER/PresenceE2.c | 58 + src/codec_utils/E2AP_MASTER/PresenceE2.h | 54 + src/codec_utils/E2AP_MASTER/ProcedureCodeE2.c | 64 + src/codec_utils/E2AP_MASTER/ProcedureCodeE2.h | 55 + .../E2AP_MASTER/ProtocolIE-ContainerE2.c | 870 +++ .../E2AP_MASTER/ProtocolIE-ContainerE2.h | 253 + .../E2AP_MASTER/ProtocolIE-ContainerList.c | 9 + .../E2AP_MASTER/ProtocolIE-ContainerList.h | 23 + .../E2AP_MASTER/ProtocolIE-ContainerPairE2.c | 9 + .../E2AP_MASTER/ProtocolIE-ContainerPairE2.h | 23 + .../E2AP_MASTER/ProtocolIE-ContainerPairList.c | 9 + .../E2AP_MASTER/ProtocolIE-ContainerPairList.h | 23 + src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.c | 7424 ++++++++++++++++++++ src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.h | 757 ++ .../E2AP_MASTER/ProtocolIE-FieldPairE2.c | 9 + .../E2AP_MASTER/ProtocolIE-FieldPairE2.h | 23 + src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.c | 64 + src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.h | 78 + .../E2AP_MASTER/ProtocolIE-SingleContainerE2.c | 147 + .../E2AP_MASTER/ProtocolIE-SingleContainerE2.h | 120 + src/codec_utils/E2AP_MASTER/RANfunction-Item.c | 70 + src/codec_utils/E2AP_MASTER/RANfunction-Item.h | 46 + .../E2AP_MASTER/RANfunctionDefinition.c | 31 + .../E2AP_MASTER/RANfunctionDefinition.h | 45 + src/codec_utils/E2AP_MASTER/RANfunctionID-Item.c | 60 + src/codec_utils/E2AP_MASTER/RANfunctionID-Item.h | 44 + src/codec_utils/E2AP_MASTER/RANfunctionID.c | 64 + src/codec_utils/E2AP_MASTER/RANfunctionID.h | 46 + .../E2AP_MASTER/RANfunctionIDcause-Item.c | 60 + .../E2AP_MASTER/RANfunctionIDcause-Item.h | 44 + src/codec_utils/E2AP_MASTER/RANfunctionRevision.c | 64 + src/codec_utils/E2AP_MASTER/RANfunctionRevision.h | 46 + src/codec_utils/E2AP_MASTER/RANfunctions-List.c | 53 + src/codec_utils/E2AP_MASTER/RANfunctions-List.h | 42 + src/codec_utils/E2AP_MASTER/RANfunctionsID-List.c | 53 + src/codec_utils/E2AP_MASTER/RANfunctionsID-List.h | 41 + .../E2AP_MASTER/RANfunctionsIDcause-List.c | 53 + .../E2AP_MASTER/RANfunctionsIDcause-List.h | 41 + .../E2AP_MASTER/RICaction-Admitted-Item.c | 50 + .../E2AP_MASTER/RICaction-Admitted-Item.h | 42 + .../E2AP_MASTER/RICaction-Admitted-List.c | 53 + .../E2AP_MASTER/RICaction-Admitted-List.h | 41 + .../E2AP_MASTER/RICaction-NotAdmitted-Item.c | 60 + .../E2AP_MASTER/RICaction-NotAdmitted-Item.h | 44 + .../E2AP_MASTER/RICaction-NotAdmitted-List.c | 53 + .../E2AP_MASTER/RICaction-NotAdmitted-List.h | 41 + .../E2AP_MASTER/RICaction-ToBeSetup-Item.c | 83 + .../E2AP_MASTER/RICaction-ToBeSetup-Item.h | 50 + src/codec_utils/E2AP_MASTER/RICactionDefinition.c | 31 + src/codec_utils/E2AP_MASTER/RICactionDefinition.h | 45 + src/codec_utils/E2AP_MASTER/RICactionID.c | 64 + src/codec_utils/E2AP_MASTER/RICactionID.h | 46 + src/codec_utils/E2AP_MASTER/RICactionType.c | 60 + src/codec_utils/E2AP_MASTER/RICactionType.h | 57 + .../E2AP_MASTER/RICactions-ToBeSetup-List.c | 53 + .../E2AP_MASTER/RICactions-ToBeSetup-List.h | 44 + src/codec_utils/E2AP_MASTER/RICcallProcessID.c | 31 + src/codec_utils/E2AP_MASTER/RICcallProcessID.h | 45 + src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.c | 60 + src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.h | 55 + .../E2AP_MASTER/RICcontrolAcknowledge.c | 50 + .../E2AP_MASTER/RICcontrolAcknowledge.h | 44 + src/codec_utils/E2AP_MASTER/RICcontrolFailure.c | 50 + src/codec_utils/E2AP_MASTER/RICcontrolFailure.h | 44 + src/codec_utils/E2AP_MASTER/RICcontrolHeader.c | 31 + src/codec_utils/E2AP_MASTER/RICcontrolHeader.h | 45 + src/codec_utils/E2AP_MASTER/RICcontrolMessage.c | 31 + src/codec_utils/E2AP_MASTER/RICcontrolMessage.h | 45 + src/codec_utils/E2AP_MASTER/RICcontrolOutcome.c | 31 + src/codec_utils/E2AP_MASTER/RICcontrolOutcome.h | 45 + src/codec_utils/E2AP_MASTER/RICcontrolRequest.c | 50 + src/codec_utils/E2AP_MASTER/RICcontrolRequest.h | 44 + src/codec_utils/E2AP_MASTER/RICcontrolStatus.c | 60 + src/codec_utils/E2AP_MASTER/RICcontrolStatus.h | 55 + .../E2AP_MASTER/RICeventTriggerDefinition.c | 31 + .../E2AP_MASTER/RICeventTriggerDefinition.h | 45 + src/codec_utils/E2AP_MASTER/RICindication.c | 50 + src/codec_utils/E2AP_MASTER/RICindication.h | 44 + src/codec_utils/E2AP_MASTER/RICindicationHeader.c | 31 + src/codec_utils/E2AP_MASTER/RICindicationHeader.h | 45 + src/codec_utils/E2AP_MASTER/RICindicationMessage.c | 31 + src/codec_utils/E2AP_MASTER/RICindicationMessage.h | 45 + src/codec_utils/E2AP_MASTER/RICindicationSN.c | 64 + src/codec_utils/E2AP_MASTER/RICindicationSN.h | 45 + src/codec_utils/E2AP_MASTER/RICindicationType.c | 58 + src/codec_utils/E2AP_MASTER/RICindicationType.h | 54 + src/codec_utils/E2AP_MASTER/RICrequestID.c | 126 + src/codec_utils/E2AP_MASTER/RICrequestID.h | 45 + src/codec_utils/E2AP_MASTER/RICserviceQuery.c | 50 + src/codec_utils/E2AP_MASTER/RICserviceQuery.h | 44 + src/codec_utils/E2AP_MASTER/RICserviceUpdate.c | 50 + src/codec_utils/E2AP_MASTER/RICserviceUpdate.h | 44 + .../E2AP_MASTER/RICserviceUpdateAcknowledge.c | 50 + .../E2AP_MASTER/RICserviceUpdateAcknowledge.h | 44 + .../E2AP_MASTER/RICserviceUpdateFailure.c | 50 + .../E2AP_MASTER/RICserviceUpdateFailure.h | 44 + .../E2AP_MASTER/RICsubscriptionDeleteFailure.c | 50 + .../E2AP_MASTER/RICsubscriptionDeleteFailure.h | 44 + .../E2AP_MASTER/RICsubscriptionDeleteRequest.c | 50 + .../E2AP_MASTER/RICsubscriptionDeleteRequest.h | 44 + .../E2AP_MASTER/RICsubscriptionDeleteResponse.c | 50 + .../E2AP_MASTER/RICsubscriptionDeleteResponse.h | 44 + .../E2AP_MASTER/RICsubscriptionDetails.c | 60 + .../E2AP_MASTER/RICsubscriptionDetails.h | 44 + .../E2AP_MASTER/RICsubscriptionFailure.c | 50 + .../E2AP_MASTER/RICsubscriptionFailure.h | 44 + .../E2AP_MASTER/RICsubscriptionRequest.c | 50 + .../E2AP_MASTER/RICsubscriptionRequest.h | 44 + .../E2AP_MASTER/RICsubscriptionResponse.c | 50 + .../E2AP_MASTER/RICsubscriptionResponse.h | 44 + src/codec_utils/E2AP_MASTER/RICsubsequentAction.c | 60 + src/codec_utils/E2AP_MASTER/RICsubsequentAction.h | 46 + .../E2AP_MASTER/RICsubsequentActionType.c | 58 + .../E2AP_MASTER/RICsubsequentActionType.h | 56 + src/codec_utils/E2AP_MASTER/RICtimeToWait.c | 90 + src/codec_utils/E2AP_MASTER/RICtimeToWait.h | 72 + src/codec_utils/E2AP_MASTER/ResetRequest.c | 50 + src/codec_utils/E2AP_MASTER/ResetRequest.h | 44 + src/codec_utils/E2AP_MASTER/ResetResponse.c | 50 + src/codec_utils/E2AP_MASTER/ResetResponse.h | 44 + src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.c | 368 + src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.h | 91 + src/codec_utils/E2AP_MASTER/TimeToWaitE2.c | 66 + src/codec_utils/E2AP_MASTER/TimeToWaitE2.h | 58 + src/codec_utils/E2AP_MASTER/TriggeringMessageE2.c | 58 + src/codec_utils/E2AP_MASTER/TriggeringMessageE2.h | 54 + src/codec_utils/E2AP_MASTER/TypeOfErrorE2.c | 58 + src/codec_utils/E2AP_MASTER/TypeOfErrorE2.h | 56 + .../E2AP_MASTER/UnsuccessfulOutcomeE2.c | 358 + .../E2AP_MASTER/UnsuccessfulOutcomeE2.h | 89 + src/codec_utils/E2AP_MASTER/asn_constant.h | 22 + src/codec_utils/E2AP_MASTER/constr_CHOICE.c | 1533 ++++ src/codec_utils/E2AP_MASTER/constr_CHOICE.h | 80 + src/codec_utils/E2AP_MASTER/constr_CHOICE_oer.c | 380 + src/codec_utils/E2AP_MASTER/constr_SEQUENCE.c | 2059 ++++++ src/codec_utils/E2AP_MASTER/constr_SEQUENCE.h | 68 + src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.c | 358 + src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.h | 41 + src/codec_utils/E2AP_MASTER/constr_SEQUENCE_oer.c | 561 ++ src/codec_utils/E2AP_MASTER/constr_SET_OF.c | 1441 ++++ src/codec_utils/E2AP_MASTER/constr_SET_OF.h | 49 + src/codec_utils/E2AP_MASTER/constr_SET_OF_oer.c | 285 + src/codec_utils/E2AP_MASTER/constr_TYPE.c | 80 + src/codec_utils/E2AP_MASTER/constr_TYPE.h | 262 + src/codec_utils/E2AP_MASTER/constraints.c | 93 + src/codec_utils/E2AP_MASTER/constraints.h | 62 + src/codec_utils/E2AP_MASTER/e2ap | Bin 0 -> 523240 bytes src/codec_utils/E2AP_MASTER/per_encoder.h | 93 + src/codec_utils/E2AP_OLD1/CauseE2.c | 95 + src/codec_utils/E2AP_OLD1/CauseE2.h | 68 + src/codec_utils/E2AP_OLD1/CauseMisc.c | 62 + src/codec_utils/E2AP_OLD1/CauseMisc.h | 58 + src/codec_utils/E2AP_OLD1/CauseProtocol.c | 68 + src/codec_utils/E2AP_OLD1/CauseProtocol.h | 61 + src/codec_utils/E2AP_OLD1/CauseRIC.c | 76 + src/codec_utils/E2AP_OLD1/CauseRIC.h | 65 + src/codec_utils/E2AP_OLD1/CauseRICservice.c | 60 + src/codec_utils/E2AP_OLD1/CauseRICservice.h | 57 + src/codec_utils/E2AP_OLD1/CauseTransport.c | 58 + src/codec_utils/E2AP_OLD1/CauseTransport.h | 56 + .../E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.c | 70 + .../E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.h | 48 + .../E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.c | 53 + .../E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.h | 44 + .../E2AP_OLD1/CriticalityDiagnosticsE2.c | 94 + .../E2AP_OLD1/CriticalityDiagnosticsE2.h | 52 + src/codec_utils/E2AP_OLD1/CriticalityE2.c | 58 + src/codec_utils/E2AP_OLD1/CriticalityE2.h | 54 + src/codec_utils/E2AP_OLD1/E2AP-PDU.c | 78 + src/codec_utils/E2AP_OLD1/E2AP-PDU.h | 64 + src/codec_utils/E2AP_OLD1/E2AP.asn1 | 1452 ++++ src/codec_utils/E2AP_OLD1/E2setupFailure.c | 50 + src/codec_utils/E2AP_OLD1/E2setupFailure.h | 44 + src/codec_utils/E2AP_OLD1/E2setupRequest.c | 50 + src/codec_utils/E2AP_OLD1/E2setupRequest.h | 44 + src/codec_utils/E2AP_OLD1/E2setupResponse.c | 50 + src/codec_utils/E2AP_OLD1/E2setupResponse.h | 44 + src/codec_utils/E2AP_OLD1/ENB-ID-Choice.c | 192 + src/codec_utils/E2AP_OLD1/ENB-ID-Choice.h | 60 + src/codec_utils/E2AP_OLD1/ENB-ID.c | 241 + src/codec_utils/E2AP_OLD1/ENB-ID.h | 61 + src/codec_utils/E2AP_OLD1/ENGNB-ID.c | 94 + src/codec_utils/E2AP_OLD1/ENGNB-ID.h | 56 + src/codec_utils/E2AP_OLD1/ErrorIndicationE2.c | 50 + src/codec_utils/E2AP_OLD1/ErrorIndicationE2.h | 44 + src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.c | 70 + src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.h | 46 + src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.c | 70 + src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.h | 46 + src/codec_utils/E2AP_OLD1/GNB-ID-Choice.c | 94 + src/codec_utils/E2AP_OLD1/GNB-ID-Choice.h | 56 + src/codec_utils/E2AP_OLD1/GlobalE2node-ID.c | 89 + src/codec_utils/E2AP_OLD1/GlobalE2node-ID.h | 64 + src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.c | 50 + src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.h | 44 + src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.c | 50 + src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.h | 44 + src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.c | 72 + src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.h | 48 + src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.c | 50 + src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.h | 44 + src/codec_utils/E2AP_OLD1/GlobalENB-ID.c | 60 + src/codec_utils/E2AP_OLD1/GlobalENB-ID.h | 46 + src/codec_utils/E2AP_OLD1/GlobalRIC-ID.c | 99 + src/codec_utils/E2AP_OLD1/GlobalRIC-ID.h | 44 + src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.c | 60 + src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.h | 46 + src/codec_utils/E2AP_OLD1/GlobalgNB-ID.c | 60 + src/codec_utils/E2AP_OLD1/GlobalgNB-ID.h | 46 + src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.c | 60 + src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.h | 46 + src/codec_utils/E2AP_OLD1/InitiatingMessageE2.c | 398 ++ src/codec_utils/E2AP_OLD1/InitiatingMessageE2.h | 97 + src/codec_utils/E2AP_OLD1/Makefile.am.libasncodec | 288 + src/codec_utils/E2AP_OLD1/NativeEnumerated.c | 367 + src/codec_utils/E2AP_OLD1/NativeEnumerated.h | 45 + src/codec_utils/E2AP_OLD1/NativeEnumerated_oer.c | 149 + src/codec_utils/E2AP_OLD1/NativeInteger.c | 550 ++ src/codec_utils/E2AP_OLD1/NativeInteger.h | 46 + src/codec_utils/E2AP_OLD1/NativeInteger_oer.c | 99 + src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.c | 65 + src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.h | 46 + src/codec_utils/E2AP_OLD1/PresenceE2.c | 58 + src/codec_utils/E2AP_OLD1/PresenceE2.h | 54 + src/codec_utils/E2AP_OLD1/ProcedureCodeE2.c | 64 + src/codec_utils/E2AP_OLD1/ProcedureCodeE2.h | 55 + src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.c | 870 +++ src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.h | 253 + .../E2AP_OLD1/ProtocolIE-ContainerList.c | 9 + .../E2AP_OLD1/ProtocolIE-ContainerList.h | 23 + .../E2AP_OLD1/ProtocolIE-ContainerPairE2.c | 9 + .../E2AP_OLD1/ProtocolIE-ContainerPairE2.h | 23 + .../E2AP_OLD1/ProtocolIE-ContainerPairList.c | 9 + .../E2AP_OLD1/ProtocolIE-ContainerPairList.h | 23 + src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.c | 7424 ++++++++++++++++++++ src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.h | 757 ++ src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.c | 9 + src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.h | 23 + src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.c | 64 + src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.h | 78 + .../E2AP_OLD1/ProtocolIE-SingleContainerE2.c | 147 + .../E2AP_OLD1/ProtocolIE-SingleContainerE2.h | 120 + src/codec_utils/E2AP_OLD1/RANfunction-Item.c | 70 + src/codec_utils/E2AP_OLD1/RANfunction-Item.h | 46 + src/codec_utils/E2AP_OLD1/RANfunctionDefinition.c | 31 + src/codec_utils/E2AP_OLD1/RANfunctionDefinition.h | 45 + src/codec_utils/E2AP_OLD1/RANfunctionID-Item.c | 60 + src/codec_utils/E2AP_OLD1/RANfunctionID-Item.h | 44 + src/codec_utils/E2AP_OLD1/RANfunctionID.c | 64 + src/codec_utils/E2AP_OLD1/RANfunctionID.h | 46 + .../E2AP_OLD1/RANfunctionIDcause-Item.c | 60 + .../E2AP_OLD1/RANfunctionIDcause-Item.h | 44 + src/codec_utils/E2AP_OLD1/RANfunctionRevision.c | 64 + src/codec_utils/E2AP_OLD1/RANfunctionRevision.h | 46 + src/codec_utils/E2AP_OLD1/RANfunctions-List.c | 53 + src/codec_utils/E2AP_OLD1/RANfunctions-List.h | 42 + src/codec_utils/E2AP_OLD1/RANfunctionsID-List.c | 53 + src/codec_utils/E2AP_OLD1/RANfunctionsID-List.h | 41 + .../E2AP_OLD1/RANfunctionsIDcause-List.c | 53 + .../E2AP_OLD1/RANfunctionsIDcause-List.h | 41 + .../E2AP_OLD1/RICaction-Admitted-Item.c | 50 + .../E2AP_OLD1/RICaction-Admitted-Item.h | 42 + .../E2AP_OLD1/RICaction-Admitted-List.c | 53 + .../E2AP_OLD1/RICaction-Admitted-List.h | 41 + .../E2AP_OLD1/RICaction-NotAdmitted-Item.c | 60 + .../E2AP_OLD1/RICaction-NotAdmitted-Item.h | 44 + .../E2AP_OLD1/RICaction-NotAdmitted-List.c | 53 + .../E2AP_OLD1/RICaction-NotAdmitted-List.h | 41 + .../E2AP_OLD1/RICaction-ToBeSetup-Item.c | 83 + .../E2AP_OLD1/RICaction-ToBeSetup-Item.h | 50 + src/codec_utils/E2AP_OLD1/RICactionDefinition.c | 31 + src/codec_utils/E2AP_OLD1/RICactionDefinition.h | 45 + src/codec_utils/E2AP_OLD1/RICactionID.c | 64 + src/codec_utils/E2AP_OLD1/RICactionID.h | 46 + src/codec_utils/E2AP_OLD1/RICactionType.c | 60 + src/codec_utils/E2AP_OLD1/RICactionType.h | 57 + .../E2AP_OLD1/RICactions-ToBeSetup-List.c | 53 + .../E2AP_OLD1/RICactions-ToBeSetup-List.h | 44 + src/codec_utils/E2AP_OLD1/RICcallProcessID.c | 31 + src/codec_utils/E2AP_OLD1/RICcallProcessID.h | 45 + src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.c | 60 + src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.h | 55 + src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.c | 50 + src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.h | 44 + src/codec_utils/E2AP_OLD1/RICcontrolFailure.c | 50 + src/codec_utils/E2AP_OLD1/RICcontrolFailure.h | 44 + src/codec_utils/E2AP_OLD1/RICcontrolHeader.c | 31 + src/codec_utils/E2AP_OLD1/RICcontrolHeader.h | 45 + src/codec_utils/E2AP_OLD1/RICcontrolMessage.c | 31 + src/codec_utils/E2AP_OLD1/RICcontrolMessage.h | 45 + src/codec_utils/E2AP_OLD1/RICcontrolOutcome.c | 31 + src/codec_utils/E2AP_OLD1/RICcontrolOutcome.h | 45 + src/codec_utils/E2AP_OLD1/RICcontrolRequest.c | 50 + src/codec_utils/E2AP_OLD1/RICcontrolRequest.h | 44 + src/codec_utils/E2AP_OLD1/RICcontrolStatus.c | 60 + src/codec_utils/E2AP_OLD1/RICcontrolStatus.h | 55 + .../E2AP_OLD1/RICeventTriggerDefinition.c | 31 + .../E2AP_OLD1/RICeventTriggerDefinition.h | 45 + src/codec_utils/E2AP_OLD1/RICindication.c | 50 + src/codec_utils/E2AP_OLD1/RICindication.h | 44 + src/codec_utils/E2AP_OLD1/RICindicationHeader.c | 31 + src/codec_utils/E2AP_OLD1/RICindicationHeader.h | 45 + src/codec_utils/E2AP_OLD1/RICindicationMessage.c | 31 + src/codec_utils/E2AP_OLD1/RICindicationMessage.h | 45 + src/codec_utils/E2AP_OLD1/RICindicationSN.c | 64 + src/codec_utils/E2AP_OLD1/RICindicationSN.h | 45 + src/codec_utils/E2AP_OLD1/RICindicationType.c | 58 + src/codec_utils/E2AP_OLD1/RICindicationType.h | 54 + src/codec_utils/E2AP_OLD1/RICrequestID.c | 126 + src/codec_utils/E2AP_OLD1/RICrequestID.h | 45 + src/codec_utils/E2AP_OLD1/RICserviceQuery.c | 50 + src/codec_utils/E2AP_OLD1/RICserviceQuery.h | 44 + src/codec_utils/E2AP_OLD1/RICserviceUpdate.c | 50 + src/codec_utils/E2AP_OLD1/RICserviceUpdate.h | 44 + .../E2AP_OLD1/RICserviceUpdateAcknowledge.c | 50 + .../E2AP_OLD1/RICserviceUpdateAcknowledge.h | 44 + .../E2AP_OLD1/RICserviceUpdateFailure.c | 50 + .../E2AP_OLD1/RICserviceUpdateFailure.h | 44 + .../E2AP_OLD1/RICsubscriptionDeleteFailure.c | 50 + .../E2AP_OLD1/RICsubscriptionDeleteFailure.h | 44 + .../E2AP_OLD1/RICsubscriptionDeleteRequest.c | 50 + .../E2AP_OLD1/RICsubscriptionDeleteRequest.h | 44 + .../E2AP_OLD1/RICsubscriptionDeleteResponse.c | 50 + .../E2AP_OLD1/RICsubscriptionDeleteResponse.h | 44 + src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.c | 60 + src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.h | 44 + src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.c | 50 + src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.h | 44 + src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.c | 50 + src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.h | 44 + .../E2AP_OLD1/RICsubscriptionResponse.c | 50 + .../E2AP_OLD1/RICsubscriptionResponse.h | 44 + src/codec_utils/E2AP_OLD1/RICsubsequentAction.c | 60 + src/codec_utils/E2AP_OLD1/RICsubsequentAction.h | 46 + .../E2AP_OLD1/RICsubsequentActionType.c | 58 + .../E2AP_OLD1/RICsubsequentActionType.h | 56 + src/codec_utils/E2AP_OLD1/RICtimeToWait.c | 90 + src/codec_utils/E2AP_OLD1/RICtimeToWait.h | 72 + src/codec_utils/E2AP_OLD1/ResetRequest.c | 50 + src/codec_utils/E2AP_OLD1/ResetRequest.h | 44 + src/codec_utils/E2AP_OLD1/ResetResponse.c | 50 + src/codec_utils/E2AP_OLD1/ResetResponse.h | 44 + src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.c | 368 + src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.h | 91 + src/codec_utils/E2AP_OLD1/TimeToWaitE2.c | 66 + src/codec_utils/E2AP_OLD1/TimeToWaitE2.h | 58 + src/codec_utils/E2AP_OLD1/TriggeringMessageE2.c | 58 + src/codec_utils/E2AP_OLD1/TriggeringMessageE2.h | 54 + src/codec_utils/E2AP_OLD1/TypeOfErrorE2.c | 58 + src/codec_utils/E2AP_OLD1/TypeOfErrorE2.h | 56 + src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.c | 358 + src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.h | 89 + src/codec_utils/E2AP_OLD1/asn_constant.h | 22 + src/codec_utils/E2AP_OLD1/constr_CHOICE.c | 1533 ++++ src/codec_utils/E2AP_OLD1/constr_CHOICE.h | 80 + src/codec_utils/E2AP_OLD1/constr_CHOICE_oer.c | 380 + src/codec_utils/E2AP_OLD1/constr_SEQUENCE.c | 2059 ++++++ src/codec_utils/E2AP_OLD1/constr_SEQUENCE.h | 68 + src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.c | 358 + src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.h | 41 + src/codec_utils/E2AP_OLD1/constr_SEQUENCE_oer.c | 561 ++ src/codec_utils/E2AP_OLD1/constr_SET_OF.c | 1441 ++++ src/codec_utils/E2AP_OLD1/constr_SET_OF.h | 49 + src/codec_utils/E2AP_OLD1/constr_SET_OF_oer.c | 285 + src/codec_utils/E2AP_OLD1/constr_TYPE.c | 80 + src/codec_utils/E2AP_OLD1/constr_TYPE.h | 262 + src/codec_utils/E2AP_OLD1/constraints.c | 93 + src/codec_utils/E2AP_OLD1/constraints.h | 62 + src/codec_utils/E2AP_OLD1/e2ap | Bin 0 -> 523240 bytes src/codec_utils/E2AP_OLD1/per_encoder.h | 93 + src/codec_utils/E2SMKPM/BIT_STRING.c | 656 ++ src/codec_utils/E2SMKPM/BIT_STRING.h | 48 + src/codec_utils/E2SMKPM/BIT_STRING_oer.c | 174 + .../E2SMKPM/CUUPMeasurement-Container.c | 130 + .../E2SMKPM/CUUPMeasurement-Container.h | 53 + .../E2SMKPM/CellResourceReportListItem.c | 228 + .../E2SMKPM/CellResourceReportListItem.h | 58 + .../E2SMKPM/E2SM-KPM-ActionDefinition.c | 50 + .../E2SMKPM/E2SM-KPM-ActionDefinition.h | 42 + .../E2SM-KPM-EventTriggerDefinition-Format1.c | 132 + .../E2SM-KPM-EventTriggerDefinition-Format1.h | 53 + .../E2SMKPM/E2SM-KPM-EventTriggerDefinition.c | 56 + .../E2SMKPM/E2SM-KPM-EventTriggerDefinition.h | 55 + .../E2SMKPM/E2SM-KPM-IndicationHeader-Format1.c | 171 + .../E2SMKPM/E2SM-KPM-IndicationHeader-Format1.h | 55 + .../E2SMKPM/E2SM-KPM-IndicationHeader.c | 56 + .../E2SMKPM/E2SM-KPM-IndicationHeader.h | 55 + .../E2SMKPM/E2SM-KPM-IndicationMessage-Format1.c | 130 + .../E2SMKPM/E2SM-KPM-IndicationMessage-Format1.h | 53 + .../E2SMKPM/E2SM-KPM-IndicationMessage.c | 66 + .../E2SMKPM/E2SM-KPM-IndicationMessage.h | 58 + .../E2SMKPM/E2SM-KPM-RANfunction-Description.c | 275 + .../E2SMKPM/E2SM-KPM-RANfunction-Description.h | 69 + src/codec_utils/E2SMKPM/ENB-ID-Choice.c | 192 + src/codec_utils/E2SMKPM/ENB-ID-Choice.h | 60 + src/codec_utils/E2SMKPM/ENB-ID.c | 241 + src/codec_utils/E2SMKPM/ENB-ID.h | 61 + src/codec_utils/E2SMKPM/ENGNB-ID.c | 94 + src/codec_utils/E2SMKPM/ENGNB-ID.h | 56 + src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.c | 130 + src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.h | 53 + src/codec_utils/E2SMKPM/EPC-DU-PM-Container.c | 130 + src/codec_utils/E2SMKPM/EPC-DU-PM-Container.h | 53 + src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.c | 130 + src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.h | 53 + src/codec_utils/E2SMKPM/FGC-DU-PM-Container.c | 130 + src/codec_utils/E2SMKPM/FGC-DU-PM-Container.h | 53 + .../E2SMKPM/FQIPERSlicesPerPlmnListItem.c | 183 + .../E2SMKPM/FQIPERSlicesPerPlmnListItem.h | 47 + .../E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.c | 171 + .../E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.h | 46 + src/codec_utils/E2SMKPM/GNB-CU-CP-Name.c | 109 + src/codec_utils/E2SMKPM/GNB-CU-CP-Name.h | 46 + src/codec_utils/E2SMKPM/GNB-CU-UP-ID.c | 70 + src/codec_utils/E2SMKPM/GNB-CU-UP-ID.h | 46 + src/codec_utils/E2SMKPM/GNB-CU-UP-Name.c | 109 + src/codec_utils/E2SMKPM/GNB-CU-UP-Name.h | 46 + src/codec_utils/E2SMKPM/GNB-DU-ID.c | 70 + src/codec_utils/E2SMKPM/GNB-DU-ID.h | 46 + src/codec_utils/E2SMKPM/GNB-DU-Name.c | 109 + src/codec_utils/E2SMKPM/GNB-DU-Name.h | 45 + src/codec_utils/E2SMKPM/GNB-ID-Choice.c | 94 + src/codec_utils/E2SMKPM/GNB-ID-Choice.h | 56 + src/codec_utils/E2SMKPM/GlobalENB-ID.c | 60 + src/codec_utils/E2SMKPM/GlobalENB-ID.h | 46 + src/codec_utils/E2SMKPM/GlobalKPMnode-ID.c | 89 + src/codec_utils/E2SMKPM/GlobalKPMnode-ID.h | 67 + src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.c | 50 + src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.h | 44 + src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.c | 50 + src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.h | 44 + src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.c | 72 + src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.h | 48 + src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.c | 50 + src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.h | 44 + src/codec_utils/E2SMKPM/GlobalenGNB-ID.c | 60 + src/codec_utils/E2SMKPM/GlobalenGNB-ID.h | 46 + src/codec_utils/E2SMKPM/GlobalgNB-ID.c | 60 + src/codec_utils/E2SMKPM/GlobalgNB-ID.h | 46 + src/codec_utils/E2SMKPM/GlobalngeNB-ID.c | 60 + src/codec_utils/E2SMKPM/GlobalngeNB-ID.h | 46 + src/codec_utils/E2SMKPM/INTEGER.c | 1735 +++++ src/codec_utils/E2SMKPM/INTEGER.h | 108 + src/codec_utils/E2SMKPM/INTEGER_oer.c | 179 + src/codec_utils/E2SMKPM/Makefile.am.libasncodec | 214 + src/codec_utils/E2SMKPM/NI-Type.c | 60 + src/codec_utils/E2SMKPM/NI-Type.h | 57 + src/codec_utils/E2SMKPM/NRCGI.c | 60 + src/codec_utils/E2SMKPM/NRCGI.h | 42 + src/codec_utils/E2SMKPM/NRCellIdentity.c | 70 + src/codec_utils/E2SMKPM/NRCellIdentity.h | 46 + src/codec_utils/E2SMKPM/NativeEnumerated.c | 367 + src/codec_utils/E2SMKPM/NativeEnumerated.h | 45 + src/codec_utils/E2SMKPM/NativeEnumerated_oer.c | 149 + src/codec_utils/E2SMKPM/NativeInteger.c | 550 ++ src/codec_utils/E2SMKPM/NativeInteger.h | 46 + src/codec_utils/E2SMKPM/NativeInteger_oer.c | 99 + src/codec_utils/E2SMKPM/OCTET_STRING.c | 2411 +++++++ src/codec_utils/E2SMKPM/OCTET_STRING.h | 102 + src/codec_utils/E2SMKPM/OCTET_STRING_oer.c | 171 + src/codec_utils/E2SMKPM/OCUCP-PF-Container.c | 140 + src/codec_utils/E2SMKPM/OCUCP-PF-Container.h | 47 + src/codec_utils/E2SMKPM/OCUUP-PF-Container.c | 142 + src/codec_utils/E2SMKPM/OCUUP-PF-Container.h | 55 + src/codec_utils/E2SMKPM/ODU-PF-Container.c | 130 + src/codec_utils/E2SMKPM/ODU-PF-Container.h | 53 + src/codec_utils/E2SMKPM/OPEN_TYPE.c | 509 ++ src/codec_utils/E2SMKPM/OPEN_TYPE.h | 77 + src/codec_utils/E2SMKPM/OPEN_TYPE_oer.c | 92 + src/codec_utils/E2SMKPM/PF-Container.c | 78 + src/codec_utils/E2SMKPM/PF-Container.h | 58 + src/codec_utils/E2SMKPM/PF-ContainerListItem.c | 60 + src/codec_utils/E2SMKPM/PF-ContainerListItem.h | 46 + src/codec_utils/E2SMKPM/PLMN-Identity.c | 65 + src/codec_utils/E2SMKPM/PLMN-Identity.h | 46 + src/codec_utils/E2SMKPM/PM-Containers-List.c | 63 + src/codec_utils/E2SMKPM/PM-Containers-List.h | 48 + src/codec_utils/E2SMKPM/PerQCIReportListItem.c | 171 + src/codec_utils/E2SMKPM/PerQCIReportListItem.h | 46 + .../E2SMKPM/PerQCIReportListItemFormat.c | 183 + .../E2SMKPM/PerQCIReportListItemFormat.h | 47 + src/codec_utils/E2SMKPM/PlmnID-List.c | 74 + src/codec_utils/E2SMKPM/PlmnID-List.h | 50 + src/codec_utils/E2SMKPM/PrintableString.c | 130 + src/codec_utils/E2SMKPM/PrintableString.h | 37 + src/codec_utils/E2SMKPM/RAN-Container.c | 31 + src/codec_utils/E2SMKPM/RAN-Container.h | 45 + src/codec_utils/E2SMKPM/RANcallProcess-ID-string.c | 109 + src/codec_utils/E2SMKPM/RANcallProcess-ID-string.h | 45 + src/codec_utils/E2SMKPM/RANfunction-Name.c | 316 + src/codec_utils/E2SMKPM/RANfunction-Name.h | 48 + .../E2SMKPM/RIC-EventTriggerStyle-List.c | 70 + .../E2SMKPM/RIC-EventTriggerStyle-List.h | 48 + src/codec_utils/E2SMKPM/RIC-Format-Type.c | 31 + src/codec_utils/E2SMKPM/RIC-Format-Type.h | 45 + src/codec_utils/E2SMKPM/RIC-ReportStyle-List.c | 80 + src/codec_utils/E2SMKPM/RIC-ReportStyle-List.h | 49 + src/codec_utils/E2SMKPM/RIC-Style-Name.c | 109 + src/codec_utils/E2SMKPM/RIC-Style-Name.h | 46 + src/codec_utils/E2SMKPM/RIC-Style-Type.c | 31 + src/codec_utils/E2SMKPM/RIC-Style-Type.h | 45 + src/codec_utils/E2SMKPM/RT-Period-IE.c | 94 + src/codec_utils/E2SMKPM/RT-Period-IE.h | 74 + src/codec_utils/E2SMKPM/SNSSAI.c | 130 + src/codec_utils/E2SMKPM/SNSSAI.h | 41 + .../E2SMKPM/ServedPlmnPerCellListItem.c | 74 + .../E2SMKPM/ServedPlmnPerCellListItem.h | 50 + .../E2SMKPM/SlicePerPlmnPerCellListItem.c | 140 + .../E2SMKPM/SlicePerPlmnPerCellListItem.h | 55 + src/codec_utils/E2SMKPM/SliceToReportListItem.c | 140 + src/codec_utils/E2SMKPM/SliceToReportListItem.h | 55 + src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.c | 50 + src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.h | 44 + src/codec_utils/E2SMKPM/a.out | Bin 0 -> 375344 bytes src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.c | 41 + src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.h | 52 + src/codec_utils/E2SMKPM/asn_SET_OF.c | 88 + src/codec_utils/E2SMKPM/asn_SET_OF.h | 72 + src/codec_utils/E2SMKPM/asn_application.c | 481 ++ src/codec_utils/E2SMKPM/asn_application.h | 171 + src/codec_utils/E2SMKPM/asn_bit_data.c | 333 + src/codec_utils/E2SMKPM/asn_bit_data.h | 83 + src/codec_utils/E2SMKPM/asn_codecs.h | 108 + src/codec_utils/E2SMKPM/asn_codecs_prim.c | 317 + src/codec_utils/E2SMKPM/asn_codecs_prim.h | 51 + src/codec_utils/E2SMKPM/asn_constant.h | 27 + src/codec_utils/E2SMKPM/asn_internal.c | 48 + src/codec_utils/E2SMKPM/asn_internal.h | 159 + src/codec_utils/E2SMKPM/asn_ioc.h | 51 + src/codec_utils/E2SMKPM/asn_random_fill.c | 56 + src/codec_utils/E2SMKPM/asn_random_fill.h | 51 + src/codec_utils/E2SMKPM/asn_system.h | 150 + src/codec_utils/E2SMKPM/ber_decoder.c | 283 + src/codec_utils/E2SMKPM/ber_decoder.h | 66 + src/codec_utils/E2SMKPM/ber_tlv_length.c | 168 + src/codec_utils/E2SMKPM/ber_tlv_length.h | 50 + src/codec_utils/E2SMKPM/ber_tlv_tag.c | 144 + src/codec_utils/E2SMKPM/ber_tlv_tag.h | 60 + src/codec_utils/E2SMKPM/constr_CHOICE.c | 1533 ++++ src/codec_utils/E2SMKPM/constr_CHOICE.h | 80 + src/codec_utils/E2SMKPM/constr_CHOICE_oer.c | 380 + src/codec_utils/E2SMKPM/constr_SEQUENCE.c | 2059 ++++++ src/codec_utils/E2SMKPM/constr_SEQUENCE.h | 68 + src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.c | 358 + src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.h | 41 + src/codec_utils/E2SMKPM/constr_SEQUENCE_oer.c | 561 ++ src/codec_utils/E2SMKPM/constr_SET_OF.c | 1441 ++++ src/codec_utils/E2SMKPM/constr_SET_OF.h | 49 + src/codec_utils/E2SMKPM/constr_SET_OF_oer.c | 285 + src/codec_utils/E2SMKPM/constr_TYPE.c | 80 + src/codec_utils/E2SMKPM/constr_TYPE.h | 262 + src/codec_utils/E2SMKPM/constraints.c | 93 + src/codec_utils/E2SMKPM/constraints.h | 62 + src/codec_utils/E2SMKPM/der_encoder.c | 194 + src/codec_utils/E2SMKPM/der_encoder.h | 68 + src/codec_utils/E2SMKPM/oer_decoder.c | 152 + src/codec_utils/E2SMKPM/oer_decoder.h | 72 + src/codec_utils/E2SMKPM/oer_encoder.c | 141 + src/codec_utils/E2SMKPM/oer_encoder.h | 70 + src/codec_utils/E2SMKPM/oer_support.c | 122 + src/codec_utils/E2SMKPM/oer_support.h | 47 + src/codec_utils/E2SMKPM/per_decoder.c | 185 + src/codec_utils/E2SMKPM/per_decoder.h | 82 + src/codec_utils/E2SMKPM/per_encoder.c | 265 + src/codec_utils/E2SMKPM/per_encoder.h | 93 + src/codec_utils/E2SMKPM/per_opentype.c | 533 ++ src/codec_utils/E2SMKPM/per_opentype.h | 44 + src/codec_utils/E2SMKPM/per_support.c | 489 ++ src/codec_utils/E2SMKPM/per_support.h | 127 + src/codec_utils/E2SMKPM/xer_decoder.c | 369 + src/codec_utils/E2SMKPM/xer_decoder.h | 106 + src/codec_utils/E2SMKPM/xer_encoder.c | 237 + src/codec_utils/E2SMKPM/xer_encoder.h | 83 + src/codec_utils/E2SMKPM/xer_support.c | 227 + src/codec_utils/E2SMKPM/xer_support.h | 55 + src/du_app/du_e2ap_msg_hdl.c | 3 + src/du_app/du_e2ap_msg_hdl.h | 1 + src/ric_stub/ric_e2ap_msg_hdl.c | 2 + 852 files changed, 94324 insertions(+), 1322 deletions(-) create mode 100644 build/common/asn_e2smkpm.mak mode change 100644 => 100755 src/codec_utils/E2AP/e2ap create mode 100644 src/codec_utils/E2AP_MASTER/CauseE2.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseE2.h create mode 100644 src/codec_utils/E2AP_MASTER/CauseMisc.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseMisc.h create mode 100644 src/codec_utils/E2AP_MASTER/CauseProtocol.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseProtocol.h create mode 100644 src/codec_utils/E2AP_MASTER/CauseRIC.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseRIC.h create mode 100644 src/codec_utils/E2AP_MASTER/CauseRICservice.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseRICservice.h create mode 100644 src/codec_utils/E2AP_MASTER/CauseTransport.c create mode 100644 src/codec_utils/E2AP_MASTER/CauseTransport.h create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.c create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.h create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.c create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.h create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.c create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.h create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityE2.c create mode 100644 src/codec_utils/E2AP_MASTER/CriticalityE2.h create mode 100644 src/codec_utils/E2AP_MASTER/E2AP-PDU.c create mode 100644 src/codec_utils/E2AP_MASTER/E2AP-PDU.h rename src/codec_utils/{E2AP => E2AP_MASTER}/E2AP.asn1 (100%) create mode 100644 src/codec_utils/E2AP_MASTER/E2setupFailure.c create mode 100644 src/codec_utils/E2AP_MASTER/E2setupFailure.h create mode 100644 src/codec_utils/E2AP_MASTER/E2setupRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/E2setupRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/E2setupResponse.c create mode 100644 src/codec_utils/E2AP_MASTER/E2setupResponse.h create mode 100644 src/codec_utils/E2AP_MASTER/ENB-ID-Choice.c create mode 100644 src/codec_utils/E2AP_MASTER/ENB-ID-Choice.h create mode 100644 src/codec_utils/E2AP_MASTER/ENB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/ENB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/ENGNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/ENGNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/ErrorIndicationE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ErrorIndicationE2.h create mode 100644 src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.c create mode 100644 src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.h create mode 100644 src/codec_utils/E2AP_MASTER/GNB-ID-Choice.c create mode 100644 src/codec_utils/E2AP_MASTER/GNB-ID-Choice.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalENB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalENB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalRIC-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalRIC-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalgNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalgNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.c create mode 100644 src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.h create mode 100644 src/codec_utils/E2AP_MASTER/InitiatingMessageE2.c create mode 100644 src/codec_utils/E2AP_MASTER/InitiatingMessageE2.h create mode 100644 src/codec_utils/E2AP_MASTER/Makefile.am.libasncodec create mode 100644 src/codec_utils/E2AP_MASTER/NativeEnumerated.c create mode 100644 src/codec_utils/E2AP_MASTER/NativeEnumerated.h create mode 100644 src/codec_utils/E2AP_MASTER/NativeEnumerated_oer.c create mode 100644 src/codec_utils/E2AP_MASTER/NativeInteger.c create mode 100644 src/codec_utils/E2AP_MASTER/NativeInteger.h create mode 100644 src/codec_utils/E2AP_MASTER/NativeInteger_oer.c create mode 100644 src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.c create mode 100644 src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.h create mode 100644 src/codec_utils/E2AP_MASTER/PresenceE2.c create mode 100644 src/codec_utils/E2AP_MASTER/PresenceE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProcedureCodeE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProcedureCodeE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.h create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.c create mode 100644 src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunction-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunction-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionDefinition.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionDefinition.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionID-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionID-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionID.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionID.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionRevision.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionRevision.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctions-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctions-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionsID-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionsID-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.c create mode 100644 src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.h create mode 100644 src/codec_utils/E2AP_MASTER/RICactionDefinition.c create mode 100644 src/codec_utils/E2AP_MASTER/RICactionDefinition.h create mode 100644 src/codec_utils/E2AP_MASTER/RICactionID.c create mode 100644 src/codec_utils/E2AP_MASTER/RICactionID.h create mode 100644 src/codec_utils/E2AP_MASTER/RICactionType.c create mode 100644 src/codec_utils/E2AP_MASTER/RICactionType.h create mode 100644 src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.c create mode 100644 src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcallProcessID.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcallProcessID.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolFailure.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolFailure.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolHeader.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolHeader.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolMessage.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolMessage.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolOutcome.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolOutcome.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolStatus.c create mode 100644 src/codec_utils/E2AP_MASTER/RICcontrolStatus.h create mode 100644 src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.c create mode 100644 src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.h create mode 100644 src/codec_utils/E2AP_MASTER/RICindication.c create mode 100644 src/codec_utils/E2AP_MASTER/RICindication.h create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationHeader.c create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationHeader.h create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationMessage.c create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationMessage.h create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationSN.c create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationSN.h create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationType.c create mode 100644 src/codec_utils/E2AP_MASTER/RICindicationType.h create mode 100644 src/codec_utils/E2AP_MASTER/RICrequestID.c create mode 100644 src/codec_utils/E2AP_MASTER/RICrequestID.h create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceQuery.c create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceQuery.h create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdate.c create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdate.h create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.c create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.h create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.c create mode 100644 src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubsequentAction.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubsequentAction.h create mode 100644 src/codec_utils/E2AP_MASTER/RICsubsequentActionType.c create mode 100644 src/codec_utils/E2AP_MASTER/RICsubsequentActionType.h create mode 100644 src/codec_utils/E2AP_MASTER/RICtimeToWait.c create mode 100644 src/codec_utils/E2AP_MASTER/RICtimeToWait.h create mode 100644 src/codec_utils/E2AP_MASTER/ResetRequest.c create mode 100644 src/codec_utils/E2AP_MASTER/ResetRequest.h create mode 100644 src/codec_utils/E2AP_MASTER/ResetResponse.c create mode 100644 src/codec_utils/E2AP_MASTER/ResetResponse.h create mode 100644 src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.c create mode 100644 src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.h create mode 100644 src/codec_utils/E2AP_MASTER/TimeToWaitE2.c create mode 100644 src/codec_utils/E2AP_MASTER/TimeToWaitE2.h create mode 100644 src/codec_utils/E2AP_MASTER/TriggeringMessageE2.c create mode 100644 src/codec_utils/E2AP_MASTER/TriggeringMessageE2.h create mode 100644 src/codec_utils/E2AP_MASTER/TypeOfErrorE2.c create mode 100644 src/codec_utils/E2AP_MASTER/TypeOfErrorE2.h create mode 100644 src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.c create mode 100644 src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.h create mode 100644 src/codec_utils/E2AP_MASTER/asn_constant.h create mode 100644 src/codec_utils/E2AP_MASTER/constr_CHOICE.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_CHOICE.h create mode 100644 src/codec_utils/E2AP_MASTER/constr_CHOICE_oer.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_SEQUENCE.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_SEQUENCE.h create mode 100644 src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.h create mode 100644 src/codec_utils/E2AP_MASTER/constr_SEQUENCE_oer.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_SET_OF.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_SET_OF.h create mode 100644 src/codec_utils/E2AP_MASTER/constr_SET_OF_oer.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_TYPE.c create mode 100644 src/codec_utils/E2AP_MASTER/constr_TYPE.h create mode 100644 src/codec_utils/E2AP_MASTER/constraints.c create mode 100644 src/codec_utils/E2AP_MASTER/constraints.h create mode 100644 src/codec_utils/E2AP_MASTER/e2ap create mode 100644 src/codec_utils/E2AP_MASTER/per_encoder.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseE2.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseE2.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseMisc.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseMisc.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseProtocol.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseProtocol.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseRIC.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseRIC.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseRICservice.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseRICservice.h create mode 100644 src/codec_utils/E2AP_OLD1/CauseTransport.c create mode 100644 src/codec_utils/E2AP_OLD1/CauseTransport.h create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.c create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.h create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.c create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.h create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.c create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.h create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityE2.c create mode 100644 src/codec_utils/E2AP_OLD1/CriticalityE2.h create mode 100644 src/codec_utils/E2AP_OLD1/E2AP-PDU.c create mode 100644 src/codec_utils/E2AP_OLD1/E2AP-PDU.h create mode 100644 src/codec_utils/E2AP_OLD1/E2AP.asn1 create mode 100644 src/codec_utils/E2AP_OLD1/E2setupFailure.c create mode 100644 src/codec_utils/E2AP_OLD1/E2setupFailure.h create mode 100644 src/codec_utils/E2AP_OLD1/E2setupRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/E2setupRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/E2setupResponse.c create mode 100644 src/codec_utils/E2AP_OLD1/E2setupResponse.h create mode 100644 src/codec_utils/E2AP_OLD1/ENB-ID-Choice.c create mode 100644 src/codec_utils/E2AP_OLD1/ENB-ID-Choice.h create mode 100644 src/codec_utils/E2AP_OLD1/ENB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/ENB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/ENGNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/ENGNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/ErrorIndicationE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ErrorIndicationE2.h create mode 100644 src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.c create mode 100644 src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.h create mode 100644 src/codec_utils/E2AP_OLD1/GNB-ID-Choice.c create mode 100644 src/codec_utils/E2AP_OLD1/GNB-ID-Choice.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalENB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalENB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalRIC-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalRIC-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalgNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalgNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.c create mode 100644 src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.h create mode 100644 src/codec_utils/E2AP_OLD1/InitiatingMessageE2.c create mode 100644 src/codec_utils/E2AP_OLD1/InitiatingMessageE2.h create mode 100644 src/codec_utils/E2AP_OLD1/Makefile.am.libasncodec create mode 100644 src/codec_utils/E2AP_OLD1/NativeEnumerated.c create mode 100644 src/codec_utils/E2AP_OLD1/NativeEnumerated.h create mode 100644 src/codec_utils/E2AP_OLD1/NativeEnumerated_oer.c create mode 100644 src/codec_utils/E2AP_OLD1/NativeInteger.c create mode 100644 src/codec_utils/E2AP_OLD1/NativeInteger.h create mode 100644 src/codec_utils/E2AP_OLD1/NativeInteger_oer.c create mode 100644 src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.c create mode 100644 src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.h create mode 100644 src/codec_utils/E2AP_OLD1/PresenceE2.c create mode 100644 src/codec_utils/E2AP_OLD1/PresenceE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProcedureCodeE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProcedureCodeE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.h create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.c create mode 100644 src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunction-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunction-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionDefinition.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionDefinition.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionID-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionID-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionID.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionID.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionRevision.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionRevision.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctions-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctions-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionsID-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionsID-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.c create mode 100644 src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.h create mode 100644 src/codec_utils/E2AP_OLD1/RICactionDefinition.c create mode 100644 src/codec_utils/E2AP_OLD1/RICactionDefinition.h create mode 100644 src/codec_utils/E2AP_OLD1/RICactionID.c create mode 100644 src/codec_utils/E2AP_OLD1/RICactionID.h create mode 100644 src/codec_utils/E2AP_OLD1/RICactionType.c create mode 100644 src/codec_utils/E2AP_OLD1/RICactionType.h create mode 100644 src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.c create mode 100644 src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcallProcessID.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcallProcessID.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolFailure.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolFailure.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolHeader.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolHeader.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolMessage.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolMessage.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolOutcome.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolOutcome.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolStatus.c create mode 100644 src/codec_utils/E2AP_OLD1/RICcontrolStatus.h create mode 100644 src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.c create mode 100644 src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.h create mode 100644 src/codec_utils/E2AP_OLD1/RICindication.c create mode 100644 src/codec_utils/E2AP_OLD1/RICindication.h create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationHeader.c create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationHeader.h create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationMessage.c create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationMessage.h create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationSN.c create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationSN.h create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationType.c create mode 100644 src/codec_utils/E2AP_OLD1/RICindicationType.h create mode 100644 src/codec_utils/E2AP_OLD1/RICrequestID.c create mode 100644 src/codec_utils/E2AP_OLD1/RICrequestID.h create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceQuery.c create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceQuery.h create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdate.c create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdate.h create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.c create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.h create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.c create mode 100644 src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubsequentAction.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubsequentAction.h create mode 100644 src/codec_utils/E2AP_OLD1/RICsubsequentActionType.c create mode 100644 src/codec_utils/E2AP_OLD1/RICsubsequentActionType.h create mode 100644 src/codec_utils/E2AP_OLD1/RICtimeToWait.c create mode 100644 src/codec_utils/E2AP_OLD1/RICtimeToWait.h create mode 100644 src/codec_utils/E2AP_OLD1/ResetRequest.c create mode 100644 src/codec_utils/E2AP_OLD1/ResetRequest.h create mode 100644 src/codec_utils/E2AP_OLD1/ResetResponse.c create mode 100644 src/codec_utils/E2AP_OLD1/ResetResponse.h create mode 100644 src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.c create mode 100644 src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.h create mode 100644 src/codec_utils/E2AP_OLD1/TimeToWaitE2.c create mode 100644 src/codec_utils/E2AP_OLD1/TimeToWaitE2.h create mode 100644 src/codec_utils/E2AP_OLD1/TriggeringMessageE2.c create mode 100644 src/codec_utils/E2AP_OLD1/TriggeringMessageE2.h create mode 100644 src/codec_utils/E2AP_OLD1/TypeOfErrorE2.c create mode 100644 src/codec_utils/E2AP_OLD1/TypeOfErrorE2.h create mode 100644 src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.c create mode 100644 src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.h create mode 100644 src/codec_utils/E2AP_OLD1/asn_constant.h create mode 100644 src/codec_utils/E2AP_OLD1/constr_CHOICE.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_CHOICE.h create mode 100644 src/codec_utils/E2AP_OLD1/constr_CHOICE_oer.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_SEQUENCE.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_SEQUENCE.h create mode 100644 src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.h create mode 100644 src/codec_utils/E2AP_OLD1/constr_SEQUENCE_oer.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_SET_OF.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_SET_OF.h create mode 100644 src/codec_utils/E2AP_OLD1/constr_SET_OF_oer.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_TYPE.c create mode 100644 src/codec_utils/E2AP_OLD1/constr_TYPE.h create mode 100644 src/codec_utils/E2AP_OLD1/constraints.c create mode 100644 src/codec_utils/E2AP_OLD1/constraints.h create mode 100644 src/codec_utils/E2AP_OLD1/e2ap create mode 100644 src/codec_utils/E2AP_OLD1/per_encoder.h create mode 100644 src/codec_utils/E2SMKPM/BIT_STRING.c create mode 100644 src/codec_utils/E2SMKPM/BIT_STRING.h create mode 100644 src/codec_utils/E2SMKPM/BIT_STRING_oer.c create mode 100644 src/codec_utils/E2SMKPM/CUUPMeasurement-Container.c create mode 100644 src/codec_utils/E2SMKPM/CUUPMeasurement-Container.h create mode 100644 src/codec_utils/E2SMKPM/CellResourceReportListItem.c create mode 100644 src/codec_utils/E2SMKPM/CellResourceReportListItem.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.h create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.c create mode 100644 src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.h create mode 100644 src/codec_utils/E2SMKPM/ENB-ID-Choice.c create mode 100644 src/codec_utils/E2SMKPM/ENB-ID-Choice.h create mode 100644 src/codec_utils/E2SMKPM/ENB-ID.c create mode 100644 src/codec_utils/E2SMKPM/ENB-ID.h create mode 100644 src/codec_utils/E2SMKPM/ENGNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/ENGNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.c create mode 100644 src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.h create mode 100644 src/codec_utils/E2SMKPM/EPC-DU-PM-Container.c create mode 100644 src/codec_utils/E2SMKPM/EPC-DU-PM-Container.h create mode 100644 src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.c create mode 100644 src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.h create mode 100644 src/codec_utils/E2SMKPM/FGC-DU-PM-Container.c create mode 100644 src/codec_utils/E2SMKPM/FGC-DU-PM-Container.h create mode 100644 src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.c create mode 100644 src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.h create mode 100644 src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.c create mode 100644 src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.h create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-CP-Name.c create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-CP-Name.h create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-UP-ID.c create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-UP-ID.h create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-UP-Name.c create mode 100644 src/codec_utils/E2SMKPM/GNB-CU-UP-Name.h create mode 100644 src/codec_utils/E2SMKPM/GNB-DU-ID.c create mode 100644 src/codec_utils/E2SMKPM/GNB-DU-ID.h create mode 100644 src/codec_utils/E2SMKPM/GNB-DU-Name.c create mode 100644 src/codec_utils/E2SMKPM/GNB-DU-Name.h create mode 100644 src/codec_utils/E2SMKPM/GNB-ID-Choice.c create mode 100644 src/codec_utils/E2SMKPM/GNB-ID-Choice.h create mode 100644 src/codec_utils/E2SMKPM/GlobalENB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalENB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalenGNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalenGNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalgNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalgNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/GlobalngeNB-ID.c create mode 100644 src/codec_utils/E2SMKPM/GlobalngeNB-ID.h create mode 100644 src/codec_utils/E2SMKPM/INTEGER.c create mode 100644 src/codec_utils/E2SMKPM/INTEGER.h create mode 100644 src/codec_utils/E2SMKPM/INTEGER_oer.c create mode 100644 src/codec_utils/E2SMKPM/Makefile.am.libasncodec create mode 100644 src/codec_utils/E2SMKPM/NI-Type.c create mode 100644 src/codec_utils/E2SMKPM/NI-Type.h create mode 100644 src/codec_utils/E2SMKPM/NRCGI.c create mode 100644 src/codec_utils/E2SMKPM/NRCGI.h create mode 100644 src/codec_utils/E2SMKPM/NRCellIdentity.c create mode 100644 src/codec_utils/E2SMKPM/NRCellIdentity.h create mode 100644 src/codec_utils/E2SMKPM/NativeEnumerated.c create mode 100644 src/codec_utils/E2SMKPM/NativeEnumerated.h create mode 100644 src/codec_utils/E2SMKPM/NativeEnumerated_oer.c create mode 100644 src/codec_utils/E2SMKPM/NativeInteger.c create mode 100644 src/codec_utils/E2SMKPM/NativeInteger.h create mode 100644 src/codec_utils/E2SMKPM/NativeInteger_oer.c create mode 100644 src/codec_utils/E2SMKPM/OCTET_STRING.c create mode 100644 src/codec_utils/E2SMKPM/OCTET_STRING.h create mode 100644 src/codec_utils/E2SMKPM/OCTET_STRING_oer.c create mode 100644 src/codec_utils/E2SMKPM/OCUCP-PF-Container.c create mode 100644 src/codec_utils/E2SMKPM/OCUCP-PF-Container.h create mode 100644 src/codec_utils/E2SMKPM/OCUUP-PF-Container.c create mode 100644 src/codec_utils/E2SMKPM/OCUUP-PF-Container.h create mode 100644 src/codec_utils/E2SMKPM/ODU-PF-Container.c create mode 100644 src/codec_utils/E2SMKPM/ODU-PF-Container.h create mode 100644 src/codec_utils/E2SMKPM/OPEN_TYPE.c create mode 100644 src/codec_utils/E2SMKPM/OPEN_TYPE.h create mode 100644 src/codec_utils/E2SMKPM/OPEN_TYPE_oer.c create mode 100644 src/codec_utils/E2SMKPM/PF-Container.c create mode 100644 src/codec_utils/E2SMKPM/PF-Container.h create mode 100644 src/codec_utils/E2SMKPM/PF-ContainerListItem.c create mode 100644 src/codec_utils/E2SMKPM/PF-ContainerListItem.h create mode 100644 src/codec_utils/E2SMKPM/PLMN-Identity.c create mode 100644 src/codec_utils/E2SMKPM/PLMN-Identity.h create mode 100644 src/codec_utils/E2SMKPM/PM-Containers-List.c create mode 100644 src/codec_utils/E2SMKPM/PM-Containers-List.h create mode 100644 src/codec_utils/E2SMKPM/PerQCIReportListItem.c create mode 100644 src/codec_utils/E2SMKPM/PerQCIReportListItem.h create mode 100644 src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.c create mode 100644 src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.h create mode 100644 src/codec_utils/E2SMKPM/PlmnID-List.c create mode 100644 src/codec_utils/E2SMKPM/PlmnID-List.h create mode 100644 src/codec_utils/E2SMKPM/PrintableString.c create mode 100644 src/codec_utils/E2SMKPM/PrintableString.h create mode 100644 src/codec_utils/E2SMKPM/RAN-Container.c create mode 100644 src/codec_utils/E2SMKPM/RAN-Container.h create mode 100644 src/codec_utils/E2SMKPM/RANcallProcess-ID-string.c create mode 100644 src/codec_utils/E2SMKPM/RANcallProcess-ID-string.h create mode 100644 src/codec_utils/E2SMKPM/RANfunction-Name.c create mode 100644 src/codec_utils/E2SMKPM/RANfunction-Name.h create mode 100644 src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.c create mode 100644 src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.h create mode 100644 src/codec_utils/E2SMKPM/RIC-Format-Type.c create mode 100644 src/codec_utils/E2SMKPM/RIC-Format-Type.h create mode 100644 src/codec_utils/E2SMKPM/RIC-ReportStyle-List.c create mode 100644 src/codec_utils/E2SMKPM/RIC-ReportStyle-List.h create mode 100644 src/codec_utils/E2SMKPM/RIC-Style-Name.c create mode 100644 src/codec_utils/E2SMKPM/RIC-Style-Name.h create mode 100644 src/codec_utils/E2SMKPM/RIC-Style-Type.c create mode 100644 src/codec_utils/E2SMKPM/RIC-Style-Type.h create mode 100644 src/codec_utils/E2SMKPM/RT-Period-IE.c create mode 100644 src/codec_utils/E2SMKPM/RT-Period-IE.h create mode 100644 src/codec_utils/E2SMKPM/SNSSAI.c create mode 100644 src/codec_utils/E2SMKPM/SNSSAI.h create mode 100644 src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.c create mode 100644 src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.h create mode 100644 src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.c create mode 100644 src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.h create mode 100644 src/codec_utils/E2SMKPM/SliceToReportListItem.c create mode 100644 src/codec_utils/E2SMKPM/SliceToReportListItem.h create mode 100644 src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.c create mode 100644 src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.h create mode 100755 src/codec_utils/E2SMKPM/a.out create mode 100644 src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.c create mode 100644 src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.h create mode 100644 src/codec_utils/E2SMKPM/asn_SET_OF.c create mode 100644 src/codec_utils/E2SMKPM/asn_SET_OF.h create mode 100644 src/codec_utils/E2SMKPM/asn_application.c create mode 100644 src/codec_utils/E2SMKPM/asn_application.h create mode 100644 src/codec_utils/E2SMKPM/asn_bit_data.c create mode 100644 src/codec_utils/E2SMKPM/asn_bit_data.h create mode 100644 src/codec_utils/E2SMKPM/asn_codecs.h create mode 100644 src/codec_utils/E2SMKPM/asn_codecs_prim.c create mode 100644 src/codec_utils/E2SMKPM/asn_codecs_prim.h create mode 100644 src/codec_utils/E2SMKPM/asn_constant.h create mode 100644 src/codec_utils/E2SMKPM/asn_internal.c create mode 100644 src/codec_utils/E2SMKPM/asn_internal.h create mode 100644 src/codec_utils/E2SMKPM/asn_ioc.h create mode 100644 src/codec_utils/E2SMKPM/asn_random_fill.c create mode 100644 src/codec_utils/E2SMKPM/asn_random_fill.h create mode 100644 src/codec_utils/E2SMKPM/asn_system.h create mode 100644 src/codec_utils/E2SMKPM/ber_decoder.c create mode 100644 src/codec_utils/E2SMKPM/ber_decoder.h create mode 100644 src/codec_utils/E2SMKPM/ber_tlv_length.c create mode 100644 src/codec_utils/E2SMKPM/ber_tlv_length.h create mode 100644 src/codec_utils/E2SMKPM/ber_tlv_tag.c create mode 100644 src/codec_utils/E2SMKPM/ber_tlv_tag.h create mode 100644 src/codec_utils/E2SMKPM/constr_CHOICE.c create mode 100644 src/codec_utils/E2SMKPM/constr_CHOICE.h create mode 100644 src/codec_utils/E2SMKPM/constr_CHOICE_oer.c create mode 100644 src/codec_utils/E2SMKPM/constr_SEQUENCE.c create mode 100644 src/codec_utils/E2SMKPM/constr_SEQUENCE.h create mode 100644 src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.c create mode 100644 src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.h create mode 100644 src/codec_utils/E2SMKPM/constr_SEQUENCE_oer.c create mode 100644 src/codec_utils/E2SMKPM/constr_SET_OF.c create mode 100644 src/codec_utils/E2SMKPM/constr_SET_OF.h create mode 100644 src/codec_utils/E2SMKPM/constr_SET_OF_oer.c create mode 100644 src/codec_utils/E2SMKPM/constr_TYPE.c create mode 100644 src/codec_utils/E2SMKPM/constr_TYPE.h create mode 100644 src/codec_utils/E2SMKPM/constraints.c create mode 100644 src/codec_utils/E2SMKPM/constraints.h create mode 100644 src/codec_utils/E2SMKPM/der_encoder.c create mode 100644 src/codec_utils/E2SMKPM/der_encoder.h create mode 100644 src/codec_utils/E2SMKPM/oer_decoder.c create mode 100644 src/codec_utils/E2SMKPM/oer_decoder.h create mode 100644 src/codec_utils/E2SMKPM/oer_encoder.c create mode 100644 src/codec_utils/E2SMKPM/oer_encoder.h create mode 100644 src/codec_utils/E2SMKPM/oer_support.c create mode 100644 src/codec_utils/E2SMKPM/oer_support.h create mode 100644 src/codec_utils/E2SMKPM/per_decoder.c create mode 100644 src/codec_utils/E2SMKPM/per_decoder.h create mode 100644 src/codec_utils/E2SMKPM/per_encoder.c create mode 100644 src/codec_utils/E2SMKPM/per_encoder.h create mode 100644 src/codec_utils/E2SMKPM/per_opentype.c create mode 100644 src/codec_utils/E2SMKPM/per_opentype.h create mode 100644 src/codec_utils/E2SMKPM/per_support.c create mode 100644 src/codec_utils/E2SMKPM/per_support.h create mode 100644 src/codec_utils/E2SMKPM/xer_decoder.c create mode 100644 src/codec_utils/E2SMKPM/xer_decoder.h create mode 100644 src/codec_utils/E2SMKPM/xer_encoder.c create mode 100644 src/codec_utils/E2SMKPM/xer_encoder.h create mode 100644 src/codec_utils/E2SMKPM/xer_support.c create mode 100644 src/codec_utils/E2SMKPM/xer_support.h diff --git a/build/common/asn_e2smkpm.mak b/build/common/asn_e2smkpm.mak new file mode 100644 index 000000000..429019d9c --- /dev/null +++ b/build/common/asn_e2smkpm.mak @@ -0,0 +1,49 @@ +################################################################################ +# Copyright (c) [2017-2019] [Radisys] # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +################################################################################ + +# This is makefile for ASN + +include ../common/rsys_fancy.mak +include ../common/env.mak +COLOR=$(COLOR_RED) + +SRC_DIR=$(ROOT_DIR)/src/codec_utils/E2SMKPM +C_SRCS=$(wildcard $(SRC_DIR)/*.c) +C_OBJS=$(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(C_SRCS)) + +lib: $(LIB_DIR)/libasn_e2smkpm.a +include $(COM_BUILD_DIR)/compile.mak + +I_OPTS+=-I$(SRC_DIR)/../common +#-------------------------------------------------------------# +#Linker macros +#-------------------------------------------------------------# +$(LIB_DIR)/libasn_e2smkpm.a:$(C_OBJS) + @echo -e "Creating Archive $(COLOR) $@ $(REVERT_COLOR)" + $(Q)ar -cr $(LIB_DIR)/libasn_e2smkpm.a $(C_OBJS) + + +#-------------------------------------------------------------# +#Clean macros +#-------------------------------------------------------------# +clean: + @echo -e "$(COLOR_RED)Cleaning ASN$(REVERT_COLOR)" + @echo $(SRC_DIR) $(CM_DIR) + $(Q)\rm -f $(LIB_DIR)/libasn_e2smkpm.a $(C_OBJS) + +#-------------------------------------------------------------# +#End of File +#-------------------------------------------------------------# diff --git a/build/odu/makefile b/build/odu/makefile index c165fbcdd..c83026911 100644 --- a/build/odu/makefile +++ b/build/odu/makefile @@ -196,6 +196,7 @@ du: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_f1ap.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2ap.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_rrc.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2smkpm.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/du_app.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/rlc.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' @@ -218,6 +219,7 @@ clean_odu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_f1ap.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2ap.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_rrc.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2smkpm.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/rlc.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mac.mak clean OBJ_DIR=$(OBJ_ROOT)/odu LIB_DIR=$(LIB_ROOT)/odu LOG_DIR=$(LOG_ROOT)/odu CC='$(CC1)' @@ -247,6 +249,7 @@ cu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_common.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_f1ap.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_rrc.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2smkpm.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) @@ -258,6 +261,7 @@ clean_cu: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_common.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_f1ap.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_rrc.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2smkpm.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak clean OBJ_DIR=$(OBJ_ROOT)/cu_stub LIB_DIR=$(LIB_ROOT)/cu_stub LOG_DIR=$(LOG_ROOT)/cu_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) @@ -292,6 +296,7 @@ clean_ric: $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_common.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2ap.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_rrc.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' + $(Q)$(MAKE) -f $(COM_BUILD_DIR)/asn_e2smkpm.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/cm.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' $(Q)$(MAKE) -f $(COM_BUILD_DIR)/mt.mak clean OBJ_DIR=$(OBJ_ROOT)/ric_stub LIB_DIR=$(LIB_ROOT)/ric_stub LOG_DIR=$(LOG_ROOT)/ric_stub CC='$(CC1)' ifeq ($(O1_ENABLE),YES) diff --git a/src/codec_utils/E2AP/CauseE2.c b/src/codec_utils/E2AP/CauseE2.c index 4d39d1f26..00a5281f1 100644 --- a/src/codec_utils/E2AP/CauseE2.c +++ b/src/codec_utils/E2AP/CauseE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseE2.h" diff --git a/src/codec_utils/E2AP/CauseE2.h b/src/codec_utils/E2AP/CauseE2.h index 1298a7f97..dbb6195c5 100644 --- a/src/codec_utils/E2AP/CauseE2.h +++ b/src/codec_utils/E2AP/CauseE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseE2_H_ diff --git a/src/codec_utils/E2AP/CauseMisc.c b/src/codec_utils/E2AP/CauseMisc.c index 2cc334e5d..eef77cc31 100644 --- a/src/codec_utils/E2AP/CauseMisc.c +++ b/src/codec_utils/E2AP/CauseMisc.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseMisc.h" diff --git a/src/codec_utils/E2AP/CauseMisc.h b/src/codec_utils/E2AP/CauseMisc.h index bd8c78463..3114cb040 100644 --- a/src/codec_utils/E2AP/CauseMisc.h +++ b/src/codec_utils/E2AP/CauseMisc.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseMisc_H_ diff --git a/src/codec_utils/E2AP/CauseProtocol.c b/src/codec_utils/E2AP/CauseProtocol.c index 6f9fa4123..a288bd86f 100644 --- a/src/codec_utils/E2AP/CauseProtocol.c +++ b/src/codec_utils/E2AP/CauseProtocol.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseProtocol.h" diff --git a/src/codec_utils/E2AP/CauseProtocol.h b/src/codec_utils/E2AP/CauseProtocol.h index 75083ab9b..8d2804bfb 100644 --- a/src/codec_utils/E2AP/CauseProtocol.h +++ b/src/codec_utils/E2AP/CauseProtocol.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseProtocol_H_ diff --git a/src/codec_utils/E2AP/CauseRIC.c b/src/codec_utils/E2AP/CauseRIC.c index 18e644e92..6f5e80154 100644 --- a/src/codec_utils/E2AP/CauseRIC.c +++ b/src/codec_utils/E2AP/CauseRIC.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseRIC.h" diff --git a/src/codec_utils/E2AP/CauseRIC.h b/src/codec_utils/E2AP/CauseRIC.h index b4925f308..ac24f194f 100644 --- a/src/codec_utils/E2AP/CauseRIC.h +++ b/src/codec_utils/E2AP/CauseRIC.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseRIC_H_ diff --git a/src/codec_utils/E2AP/CauseRICservice.c b/src/codec_utils/E2AP/CauseRICservice.c index 2846bfefb..6264116da 100644 --- a/src/codec_utils/E2AP/CauseRICservice.c +++ b/src/codec_utils/E2AP/CauseRICservice.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseRICservice.h" diff --git a/src/codec_utils/E2AP/CauseRICservice.h b/src/codec_utils/E2AP/CauseRICservice.h index cc6db2d18..b689bcb01 100644 --- a/src/codec_utils/E2AP/CauseRICservice.h +++ b/src/codec_utils/E2AP/CauseRICservice.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseRICservice_H_ diff --git a/src/codec_utils/E2AP/CauseTransport.c b/src/codec_utils/E2AP/CauseTransport.c index 6189c270c..8039d1a0e 100644 --- a/src/codec_utils/E2AP/CauseTransport.c +++ b/src/codec_utils/E2AP/CauseTransport.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CauseTransport.h" diff --git a/src/codec_utils/E2AP/CauseTransport.h b/src/codec_utils/E2AP/CauseTransport.h index ec4550d12..ef7c7f731 100644 --- a/src/codec_utils/E2AP/CauseTransport.h +++ b/src/codec_utils/E2AP/CauseTransport.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CauseTransport_H_ diff --git a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.c b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.c index 2c8702565..a81a0e29d 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.c +++ b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CriticalityDiagnostics-IE-ItemE2.h" diff --git a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.h b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.h index 701fc31ef..e2c288e08 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.h +++ b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ItemE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CriticalityDiagnostics_IE_ItemE2_H_ diff --git a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.c b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.c index c548688e7..cabf9524e 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.c +++ b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CriticalityDiagnostics-IE-ListE2.h" diff --git a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.h b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.h index 6c0424df9..028a2f4e4 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.h +++ b/src/codec_utils/E2AP/CriticalityDiagnostics-IE-ListE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CriticalityDiagnostics_IE_ListE2_H_ diff --git a/src/codec_utils/E2AP/CriticalityDiagnosticsE2.c b/src/codec_utils/E2AP/CriticalityDiagnosticsE2.c index 67cee5133..81206bba5 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnosticsE2.c +++ b/src/codec_utils/E2AP/CriticalityDiagnosticsE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CriticalityDiagnosticsE2.h" diff --git a/src/codec_utils/E2AP/CriticalityDiagnosticsE2.h b/src/codec_utils/E2AP/CriticalityDiagnosticsE2.h index 4cba2c711..015709fdd 100644 --- a/src/codec_utils/E2AP/CriticalityDiagnosticsE2.h +++ b/src/codec_utils/E2AP/CriticalityDiagnosticsE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CriticalityDiagnosticsE2_H_ diff --git a/src/codec_utils/E2AP/CriticalityE2.c b/src/codec_utils/E2AP/CriticalityE2.c index 45a5d8728..5e73cbb11 100644 --- a/src/codec_utils/E2AP/CriticalityE2.c +++ b/src/codec_utils/E2AP/CriticalityE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "CriticalityE2.h" diff --git a/src/codec_utils/E2AP/CriticalityE2.h b/src/codec_utils/E2AP/CriticalityE2.h index fea39ba66..df3a40d30 100644 --- a/src/codec_utils/E2AP/CriticalityE2.h +++ b/src/codec_utils/E2AP/CriticalityE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _CriticalityE2_H_ diff --git a/src/codec_utils/E2AP/E2AP-PDU.c b/src/codec_utils/E2AP/E2AP-PDU.c index da98a385f..ddccc4160 100644 --- a/src/codec_utils/E2AP/E2AP-PDU.c +++ b/src/codec_utils/E2AP/E2AP-PDU.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "E2AP-PDU.h" diff --git a/src/codec_utils/E2AP/E2AP-PDU.h b/src/codec_utils/E2AP/E2AP-PDU.h index 04086642d..e76209be4 100644 --- a/src/codec_utils/E2AP/E2AP-PDU.h +++ b/src/codec_utils/E2AP/E2AP-PDU.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _E2AP_PDU_H_ @@ -10,9 +10,6 @@ #include -#include -#include -#include /* Including external dependencies */ #include diff --git a/src/codec_utils/E2AP/E2setupFailure.c b/src/codec_utils/E2AP/E2setupFailure.c index 83d21ef79..e8b900163 100644 --- a/src/codec_utils/E2AP/E2setupFailure.c +++ b/src/codec_utils/E2AP/E2setupFailure.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "E2setupFailure.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_E2setupFailure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct E2setupFailure, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P13, + &asn_DEF_ProtocolIE_ContainerE2_1405P13, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/E2setupFailure.h b/src/codec_utils/E2AP/E2setupFailure.h index 22bf6ac5a..1da07ff94 100644 --- a/src/codec_utils/E2AP/E2setupFailure.h +++ b/src/codec_utils/E2AP/E2setupFailure.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _E2setupFailure_H_ @@ -21,7 +21,7 @@ extern "C" { /* E2setupFailure */ typedef struct E2setupFailure { - ProtocolIE_ContainerE2_1407P13_t protocolIEs; + ProtocolIE_ContainerE2_1405P13_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/E2setupRequest.c b/src/codec_utils/E2AP/E2setupRequest.c index fcd8a379d..49bb32fd4 100644 --- a/src/codec_utils/E2AP/E2setupRequest.c +++ b/src/codec_utils/E2AP/E2setupRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "E2setupRequest.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_E2setupRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct E2setupRequest, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P11, + &asn_DEF_ProtocolIE_ContainerE2_1405P11, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/E2setupRequest.h b/src/codec_utils/E2AP/E2setupRequest.h index 283c8cab8..8bc99ab5d 100644 --- a/src/codec_utils/E2AP/E2setupRequest.h +++ b/src/codec_utils/E2AP/E2setupRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _E2setupRequest_H_ @@ -21,7 +21,7 @@ extern "C" { /* E2setupRequest */ typedef struct E2setupRequest { - ProtocolIE_ContainerE2_1407P11_t protocolIEs; + ProtocolIE_ContainerE2_1405P11_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/E2setupResponse.c b/src/codec_utils/E2AP/E2setupResponse.c index 5a9943af4..42f740b47 100644 --- a/src/codec_utils/E2AP/E2setupResponse.c +++ b/src/codec_utils/E2AP/E2setupResponse.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "E2setupResponse.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_E2setupResponse_1[] = { { ATF_NOFLAGS, 0, offsetof(struct E2setupResponse, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P12, + &asn_DEF_ProtocolIE_ContainerE2_1405P12, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/E2setupResponse.h b/src/codec_utils/E2AP/E2setupResponse.h index e1ae8e898..309f0c55f 100644 --- a/src/codec_utils/E2AP/E2setupResponse.h +++ b/src/codec_utils/E2AP/E2setupResponse.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _E2setupResponse_H_ @@ -21,7 +21,7 @@ extern "C" { /* E2setupResponse */ typedef struct E2setupResponse { - ProtocolIE_ContainerE2_1407P12_t protocolIEs; + ProtocolIE_ContainerE2_1405P12_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/ENB-ID-Choice.c b/src/codec_utils/E2AP/ENB-ID-Choice.c index 34a2970f1..133dd20a9 100644 --- a/src/codec_utils/E2AP/ENB-ID-Choice.c +++ b/src/codec_utils/E2AP/ENB-ID-Choice.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ENB-ID-Choice.h" diff --git a/src/codec_utils/E2AP/ENB-ID-Choice.h b/src/codec_utils/E2AP/ENB-ID-Choice.h index c9a3b4008..4f8c4b965 100644 --- a/src/codec_utils/E2AP/ENB-ID-Choice.h +++ b/src/codec_utils/E2AP/ENB-ID-Choice.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ENB_ID_Choice_H_ diff --git a/src/codec_utils/E2AP/ENB-ID.c b/src/codec_utils/E2AP/ENB-ID.c index 01894152f..6024da044 100644 --- a/src/codec_utils/E2AP/ENB-ID.c +++ b/src/codec_utils/E2AP/ENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ENB-ID.h" diff --git a/src/codec_utils/E2AP/ENB-ID.h b/src/codec_utils/E2AP/ENB-ID.h index e64a39d9b..4c5465b54 100644 --- a/src/codec_utils/E2AP/ENB-ID.h +++ b/src/codec_utils/E2AP/ENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ENB_ID_H_ diff --git a/src/codec_utils/E2AP/ENGNB-ID.c b/src/codec_utils/E2AP/ENGNB-ID.c index be3e5926f..812e97361 100644 --- a/src/codec_utils/E2AP/ENGNB-ID.c +++ b/src/codec_utils/E2AP/ENGNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ENGNB-ID.h" diff --git a/src/codec_utils/E2AP/ENGNB-ID.h b/src/codec_utils/E2AP/ENGNB-ID.h index 13002af16..0391b146b 100644 --- a/src/codec_utils/E2AP/ENGNB-ID.h +++ b/src/codec_utils/E2AP/ENGNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ENGNB_ID_H_ diff --git a/src/codec_utils/E2AP/ErrorIndicationE2.c b/src/codec_utils/E2AP/ErrorIndicationE2.c index 027208428..456d40655 100644 --- a/src/codec_utils/E2AP/ErrorIndicationE2.c +++ b/src/codec_utils/E2AP/ErrorIndicationE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ErrorIndicationE2.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_ErrorIndicationE2_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P10, + &asn_DEF_ProtocolIE_ContainerE2_1405P10, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/ErrorIndicationE2.h b/src/codec_utils/E2AP/ErrorIndicationE2.h index 8b752e23a..9c837b4c2 100644 --- a/src/codec_utils/E2AP/ErrorIndicationE2.h +++ b/src/codec_utils/E2AP/ErrorIndicationE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ErrorIndicationE2_H_ @@ -21,7 +21,7 @@ extern "C" { /* ErrorIndicationE2 */ typedef struct ErrorIndicationE2 { - ProtocolIE_ContainerE2_1407P10_t protocolIEs; + ProtocolIE_ContainerE2_1405P10_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/GNB-CU-UP-ID.c b/src/codec_utils/E2AP/GNB-CU-UP-ID.c index 8a017d742..ad2db68ea 100644 --- a/src/codec_utils/E2AP/GNB-CU-UP-ID.c +++ b/src/codec_utils/E2AP/GNB-CU-UP-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GNB-CU-UP-ID.h" diff --git a/src/codec_utils/E2AP/GNB-CU-UP-ID.h b/src/codec_utils/E2AP/GNB-CU-UP-ID.h index 7bf479d90..b068d3df6 100644 --- a/src/codec_utils/E2AP/GNB-CU-UP-ID.h +++ b/src/codec_utils/E2AP/GNB-CU-UP-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GNB_CU_UP_ID_H_ diff --git a/src/codec_utils/E2AP/GNB-DU-IDE2.c b/src/codec_utils/E2AP/GNB-DU-IDE2.c index 52ec04099..2be548661 100644 --- a/src/codec_utils/E2AP/GNB-DU-IDE2.c +++ b/src/codec_utils/E2AP/GNB-DU-IDE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GNB-DU-IDE2.h" diff --git a/src/codec_utils/E2AP/GNB-DU-IDE2.h b/src/codec_utils/E2AP/GNB-DU-IDE2.h index e190ee099..5d057cfde 100644 --- a/src/codec_utils/E2AP/GNB-DU-IDE2.h +++ b/src/codec_utils/E2AP/GNB-DU-IDE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GNB_DU_IDE2_H_ diff --git a/src/codec_utils/E2AP/GNB-ID-Choice.c b/src/codec_utils/E2AP/GNB-ID-Choice.c index a9284595e..c0ffc0c3a 100644 --- a/src/codec_utils/E2AP/GNB-ID-Choice.c +++ b/src/codec_utils/E2AP/GNB-ID-Choice.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GNB-ID-Choice.h" diff --git a/src/codec_utils/E2AP/GNB-ID-Choice.h b/src/codec_utils/E2AP/GNB-ID-Choice.h index ef1008775..3d37c7a15 100644 --- a/src/codec_utils/E2AP/GNB-ID-Choice.h +++ b/src/codec_utils/E2AP/GNB-ID-Choice.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GNB_ID_Choice_H_ diff --git a/src/codec_utils/E2AP/GlobalE2node-ID.c b/src/codec_utils/E2AP/GlobalE2node-ID.c index 3cfd04151..0b5cc5efe 100644 --- a/src/codec_utils/E2AP/GlobalE2node-ID.c +++ b/src/codec_utils/E2AP/GlobalE2node-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalE2node-ID.h" diff --git a/src/codec_utils/E2AP/GlobalE2node-ID.h b/src/codec_utils/E2AP/GlobalE2node-ID.h index 0596af74f..a56e99dd1 100644 --- a/src/codec_utils/E2AP/GlobalE2node-ID.h +++ b/src/codec_utils/E2AP/GlobalE2node-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalE2node_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalE2node-eNB-ID.c b/src/codec_utils/E2AP/GlobalE2node-eNB-ID.c index 2003c6c4a..09ba5b983 100644 --- a/src/codec_utils/E2AP/GlobalE2node-eNB-ID.c +++ b/src/codec_utils/E2AP/GlobalE2node-eNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalE2node-eNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalE2node-eNB-ID.h b/src/codec_utils/E2AP/GlobalE2node-eNB-ID.h index dadf6db3e..ddbbe4458 100644 --- a/src/codec_utils/E2AP/GlobalE2node-eNB-ID.h +++ b/src/codec_utils/E2AP/GlobalE2node-eNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalE2node_eNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.c b/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.c index dc4a324b1..0eea7ca0a 100644 --- a/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.c +++ b/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalE2node-en-gNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.h b/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.h index ab6b6ff78..d574d4445 100644 --- a/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.h +++ b/src/codec_utils/E2AP/GlobalE2node-en-gNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalE2node_en_gNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalE2node-gNB-ID.c b/src/codec_utils/E2AP/GlobalE2node-gNB-ID.c index fe1831520..77c61dd73 100644 --- a/src/codec_utils/E2AP/GlobalE2node-gNB-ID.c +++ b/src/codec_utils/E2AP/GlobalE2node-gNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalE2node-gNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalE2node-gNB-ID.h b/src/codec_utils/E2AP/GlobalE2node-gNB-ID.h index 3eb603645..79246740c 100644 --- a/src/codec_utils/E2AP/GlobalE2node-gNB-ID.h +++ b/src/codec_utils/E2AP/GlobalE2node-gNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalE2node_gNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.c b/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.c index 2653a0001..a8ef9df13 100644 --- a/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.c +++ b/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalE2node-ng-eNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.h b/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.h index 93b0b6015..f60cede7c 100644 --- a/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.h +++ b/src/codec_utils/E2AP/GlobalE2node-ng-eNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalE2node_ng_eNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalENB-ID.c b/src/codec_utils/E2AP/GlobalENB-ID.c index b0d89807e..29f00c4c5 100644 --- a/src/codec_utils/E2AP/GlobalENB-ID.c +++ b/src/codec_utils/E2AP/GlobalENB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalENB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalENB-ID.h b/src/codec_utils/E2AP/GlobalENB-ID.h index a9417954a..4ef2e3824 100644 --- a/src/codec_utils/E2AP/GlobalENB-ID.h +++ b/src/codec_utils/E2AP/GlobalENB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalENB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalRIC-ID.c b/src/codec_utils/E2AP/GlobalRIC-ID.c index 245ec55ad..8dd06a9b7 100644 --- a/src/codec_utils/E2AP/GlobalRIC-ID.c +++ b/src/codec_utils/E2AP/GlobalRIC-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalRIC-ID.h" diff --git a/src/codec_utils/E2AP/GlobalRIC-ID.h b/src/codec_utils/E2AP/GlobalRIC-ID.h index 43ef3672e..ee7638b53 100644 --- a/src/codec_utils/E2AP/GlobalRIC-ID.h +++ b/src/codec_utils/E2AP/GlobalRIC-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalRIC_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalenGNB-ID.c b/src/codec_utils/E2AP/GlobalenGNB-ID.c index 57c4d227a..0e87193ec 100644 --- a/src/codec_utils/E2AP/GlobalenGNB-ID.c +++ b/src/codec_utils/E2AP/GlobalenGNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalenGNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalenGNB-ID.h b/src/codec_utils/E2AP/GlobalenGNB-ID.h index 793d3992d..72c30837b 100644 --- a/src/codec_utils/E2AP/GlobalenGNB-ID.h +++ b/src/codec_utils/E2AP/GlobalenGNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalenGNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalgNB-ID.c b/src/codec_utils/E2AP/GlobalgNB-ID.c index d7f1ce6a9..5a64130aa 100644 --- a/src/codec_utils/E2AP/GlobalgNB-ID.c +++ b/src/codec_utils/E2AP/GlobalgNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalgNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalgNB-ID.h b/src/codec_utils/E2AP/GlobalgNB-ID.h index e3749a421..8b7991b72 100644 --- a/src/codec_utils/E2AP/GlobalgNB-ID.h +++ b/src/codec_utils/E2AP/GlobalgNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalgNB_ID_H_ diff --git a/src/codec_utils/E2AP/GlobalngeNB-ID.c b/src/codec_utils/E2AP/GlobalngeNB-ID.c index 8b65d9738..eabd04d22 100644 --- a/src/codec_utils/E2AP/GlobalngeNB-ID.c +++ b/src/codec_utils/E2AP/GlobalngeNB-ID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "GlobalngeNB-ID.h" diff --git a/src/codec_utils/E2AP/GlobalngeNB-ID.h b/src/codec_utils/E2AP/GlobalngeNB-ID.h index 5ededc6d7..08798d1ba 100644 --- a/src/codec_utils/E2AP/GlobalngeNB-ID.h +++ b/src/codec_utils/E2AP/GlobalngeNB-ID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _GlobalngeNB_ID_H_ diff --git a/src/codec_utils/E2AP/InitiatingMessageE2.c b/src/codec_utils/E2AP/InitiatingMessageE2.c index 3f6985983..e601ad81a 100644 --- a/src/codec_utils/E2AP/InitiatingMessageE2.c +++ b/src/codec_utils/E2AP/InitiatingMessageE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "InitiatingMessageE2.h" diff --git a/src/codec_utils/E2AP/InitiatingMessageE2.h b/src/codec_utils/E2AP/InitiatingMessageE2.h index 6d8baa4c3..8b0666e31 100644 --- a/src/codec_utils/E2AP/InitiatingMessageE2.h +++ b/src/codec_utils/E2AP/InitiatingMessageE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _InitiatingMessageE2_H_ diff --git a/src/codec_utils/E2AP/Makefile.am.libasncodec b/src/codec_utils/E2AP/Makefile.am.libasncodec index 76d673614..7b557054c 100644 --- a/src/codec_utils/E2AP/Makefile.am.libasncodec +++ b/src/codec_utils/E2AP/Makefile.am.libasncodec @@ -1,288 +1,288 @@ ASN_MODULE_SRCS= \ - ./out/E2AP-PDU.c \ - ./out/InitiatingMessageE2.c \ - ./out/SuccessfulOutcomeE2.c \ - ./out/UnsuccessfulOutcomeE2.c \ - ./out/RICsubscriptionRequest.c \ - ./out/RICsubscriptionDetails.c \ - ./out/RICactions-ToBeSetup-List.c \ - ./out/RICaction-ToBeSetup-Item.c \ - ./out/RICsubscriptionResponse.c \ - ./out/RICaction-Admitted-List.c \ - ./out/RICaction-Admitted-Item.c \ - ./out/RICaction-NotAdmitted-List.c \ - ./out/RICaction-NotAdmitted-Item.c \ - ./out/RICsubscriptionFailure.c \ - ./out/RICsubscriptionDeleteRequest.c \ - ./out/RICsubscriptionDeleteResponse.c \ - ./out/RICsubscriptionDeleteFailure.c \ - ./out/RICindication.c \ - ./out/RICcontrolRequest.c \ - ./out/RICcontrolAcknowledge.c \ - ./out/RICcontrolFailure.c \ - ./out/ErrorIndicationE2.c \ - ./out/E2setupRequest.c \ - ./out/E2setupResponse.c \ - ./out/E2setupFailure.c \ - ./out/ResetRequest.c \ - ./out/ResetResponse.c \ - ./out/RICserviceUpdate.c \ - ./out/RANfunctions-List.c \ - ./out/RANfunction-Item.c \ - ./out/RANfunctionsID-List.c \ - ./out/RANfunctionID-Item.c \ - ./out/RICserviceUpdateAcknowledge.c \ - ./out/RANfunctionsIDcause-List.c \ - ./out/RANfunctionIDcause-Item.c \ - ./out/RICserviceUpdateFailure.c \ - ./out/RICserviceQuery.c \ - ./out/CauseE2.c \ - ./out/CauseMisc.c \ - ./out/CauseProtocol.c \ - ./out/CauseRIC.c \ - ./out/CauseRICservice.c \ - ./out/CauseTransport.c \ - ./out/CriticalityDiagnosticsE2.c \ - ./out/CriticalityDiagnostics-IE-ListE2.c \ - ./out/CriticalityDiagnostics-IE-ItemE2.c \ - ./out/ENB-ID.c \ - ./out/ENB-ID-Choice.c \ - ./out/ENGNB-ID.c \ - ./out/GlobalE2node-ID.c \ - ./out/GlobalE2node-en-gNB-ID.c \ - ./out/GlobalE2node-eNB-ID.c \ - ./out/GlobalE2node-gNB-ID.c \ - ./out/GlobalE2node-ng-eNB-ID.c \ - ./out/GlobalENB-ID.c \ - ./out/GlobalenGNB-ID.c \ - ./out/GlobalgNB-ID.c \ - ./out/GlobalngeNB-ID.c \ - ./out/GlobalRIC-ID.c \ - ./out/GNB-CU-UP-ID.c \ - ./out/GNB-DU-IDE2.c \ - ./out/GNB-ID-Choice.c \ - ./out/PLMN-IdentityE2.c \ - ./out/RANfunctionDefinition.c \ - ./out/RANfunctionID.c \ - ./out/RANfunctionRevision.c \ - ./out/RICactionDefinition.c \ - ./out/RICactionID.c \ - ./out/RICactionType.c \ - ./out/RICcallProcessID.c \ - ./out/RICcontrolAckRequest.c \ - ./out/RICcontrolHeader.c \ - ./out/RICcontrolMessage.c \ - ./out/RICcontrolOutcome.c \ - ./out/RICcontrolStatus.c \ - ./out/RICeventTriggerDefinition.c \ - ./out/RICindicationHeader.c \ - ./out/RICindicationMessage.c \ - ./out/RICindicationSN.c \ - ./out/RICindicationType.c \ - ./out/RICrequestID.c \ - ./out/RICsubsequentAction.c \ - ./out/RICsubsequentActionType.c \ - ./out/RICtimeToWait.c \ - ./out/TimeToWaitE2.c \ - ./out/TypeOfErrorE2.c \ - ./out/CriticalityE2.c \ - ./out/PresenceE2.c \ - ./out/ProcedureCodeE2.c \ - ./out/ProtocolIE-IDE2.c \ - ./out/TriggeringMessageE2.c \ - ./out/ProtocolIE-ContainerE2.c \ - ./out/ProtocolIE-SingleContainerE2.c \ - ./out/ProtocolIE-FieldE2.c \ - ./out/ProtocolIE-ContainerPairE2.c \ - ./out/ProtocolIE-FieldPairE2.c \ - ./out/ProtocolIE-ContainerList.c \ - ./out/ProtocolIE-ContainerPairList.c + ./newE2AP/E2AP-PDU.c \ + ./newE2AP/InitiatingMessageE2.c \ + ./newE2AP/SuccessfulOutcomeE2.c \ + ./newE2AP/UnsuccessfulOutcomeE2.c \ + ./newE2AP/RICsubscriptionRequest.c \ + ./newE2AP/RICsubscriptionDetails.c \ + ./newE2AP/RICactions-ToBeSetup-List.c \ + ./newE2AP/RICaction-ToBeSetup-Item.c \ + ./newE2AP/RICsubscriptionResponse.c \ + ./newE2AP/RICaction-Admitted-List.c \ + ./newE2AP/RICaction-Admitted-Item.c \ + ./newE2AP/RICaction-NotAdmitted-List.c \ + ./newE2AP/RICaction-NotAdmitted-Item.c \ + ./newE2AP/RICsubscriptionFailure.c \ + ./newE2AP/RICsubscriptionDeleteRequest.c \ + ./newE2AP/RICsubscriptionDeleteResponse.c \ + ./newE2AP/RICsubscriptionDeleteFailure.c \ + ./newE2AP/RICindication.c \ + ./newE2AP/RICcontrolRequest.c \ + ./newE2AP/RICcontrolAcknowledge.c \ + ./newE2AP/RICcontrolFailure.c \ + ./newE2AP/ErrorIndicationE2.c \ + ./newE2AP/E2setupRequest.c \ + ./newE2AP/E2setupResponse.c \ + ./newE2AP/E2setupFailure.c \ + ./newE2AP/ResetRequest.c \ + ./newE2AP/ResetResponse.c \ + ./newE2AP/RICserviceUpdate.c \ + ./newE2AP/RANfunctions-List.c \ + ./newE2AP/RANfunction-Item.c \ + ./newE2AP/RANfunctionsID-List.c \ + ./newE2AP/RANfunctionID-Item.c \ + ./newE2AP/RICserviceUpdateAcknowledge.c \ + ./newE2AP/RANfunctionsIDcause-List.c \ + ./newE2AP/RANfunctionIDcause-Item.c \ + ./newE2AP/RICserviceUpdateFailure.c \ + ./newE2AP/RICserviceQuery.c \ + ./newE2AP/CauseE2.c \ + ./newE2AP/CauseMisc.c \ + ./newE2AP/CauseProtocol.c \ + ./newE2AP/CauseRIC.c \ + ./newE2AP/CauseRICservice.c \ + ./newE2AP/CauseTransport.c \ + ./newE2AP/CriticalityDiagnosticsE2.c \ + ./newE2AP/CriticalityDiagnostics-IE-ListE2.c \ + ./newE2AP/CriticalityDiagnostics-IE-ItemE2.c \ + ./newE2AP/ENB-ID.c \ + ./newE2AP/ENB-ID-Choice.c \ + ./newE2AP/ENGNB-ID.c \ + ./newE2AP/GlobalE2node-ID.c \ + ./newE2AP/GlobalE2node-en-gNB-ID.c \ + ./newE2AP/GlobalE2node-eNB-ID.c \ + ./newE2AP/GlobalE2node-gNB-ID.c \ + ./newE2AP/GlobalE2node-ng-eNB-ID.c \ + ./newE2AP/GlobalENB-ID.c \ + ./newE2AP/GlobalenGNB-ID.c \ + ./newE2AP/GlobalgNB-ID.c \ + ./newE2AP/GlobalngeNB-ID.c \ + ./newE2AP/GlobalRIC-ID.c \ + ./newE2AP/GNB-CU-UP-ID.c \ + ./newE2AP/GNB-DU-IDE2.c \ + ./newE2AP/GNB-ID-Choice.c \ + ./newE2AP/PLMN-IdentityE2.c \ + ./newE2AP/RANfunctionDefinition.c \ + ./newE2AP/RANfunctionID.c \ + ./newE2AP/RANfunctionRevision.c \ + ./newE2AP/RICactionDefinition.c \ + ./newE2AP/RICactionID.c \ + ./newE2AP/RICactionType.c \ + ./newE2AP/RICcallProcessID.c \ + ./newE2AP/RICcontrolAckRequest.c \ + ./newE2AP/RICcontrolHeader.c \ + ./newE2AP/RICcontrolMessage.c \ + ./newE2AP/RICcontrolOutcome.c \ + ./newE2AP/RICcontrolStatus.c \ + ./newE2AP/RICeventTriggerDefinition.c \ + ./newE2AP/RICindicationHeader.c \ + ./newE2AP/RICindicationMessage.c \ + ./newE2AP/RICindicationSN.c \ + ./newE2AP/RICindicationType.c \ + ./newE2AP/RICrequestID.c \ + ./newE2AP/RICsubsequentAction.c \ + ./newE2AP/RICsubsequentActionType.c \ + ./newE2AP/RICtimeToWait.c \ + ./newE2AP/TimeToWaitE2.c \ + ./newE2AP/TypeOfErrorE2.c \ + ./newE2AP/CriticalityE2.c \ + ./newE2AP/PresenceE2.c \ + ./newE2AP/ProcedureCodeE2.c \ + ./newE2AP/ProtocolIE-IDE2.c \ + ./newE2AP/TriggeringMessageE2.c \ + ./newE2AP/ProtocolIE-ContainerE2.c \ + ./newE2AP/ProtocolIE-SingleContainerE2.c \ + ./newE2AP/ProtocolIE-FieldE2.c \ + ./newE2AP/ProtocolIE-ContainerPairE2.c \ + ./newE2AP/ProtocolIE-FieldPairE2.c \ + ./newE2AP/ProtocolIE-ContainerList.c \ + ./newE2AP/ProtocolIE-ContainerPairList.c ASN_MODULE_HDRS= \ - ./out/E2AP-PDU.h \ - ./out/InitiatingMessageE2.h \ - ./out/SuccessfulOutcomeE2.h \ - ./out/UnsuccessfulOutcomeE2.h \ - ./out/RICsubscriptionRequest.h \ - ./out/RICsubscriptionDetails.h \ - ./out/RICactions-ToBeSetup-List.h \ - ./out/RICaction-ToBeSetup-Item.h \ - ./out/RICsubscriptionResponse.h \ - ./out/RICaction-Admitted-List.h \ - ./out/RICaction-Admitted-Item.h \ - ./out/RICaction-NotAdmitted-List.h \ - ./out/RICaction-NotAdmitted-Item.h \ - ./out/RICsubscriptionFailure.h \ - ./out/RICsubscriptionDeleteRequest.h \ - ./out/RICsubscriptionDeleteResponse.h \ - ./out/RICsubscriptionDeleteFailure.h \ - ./out/RICindication.h \ - ./out/RICcontrolRequest.h \ - ./out/RICcontrolAcknowledge.h \ - ./out/RICcontrolFailure.h \ - ./out/ErrorIndicationE2.h \ - ./out/E2setupRequest.h \ - ./out/E2setupResponse.h \ - ./out/E2setupFailure.h \ - ./out/ResetRequest.h \ - ./out/ResetResponse.h \ - ./out/RICserviceUpdate.h \ - ./out/RANfunctions-List.h \ - ./out/RANfunction-Item.h \ - ./out/RANfunctionsID-List.h \ - ./out/RANfunctionID-Item.h \ - ./out/RICserviceUpdateAcknowledge.h \ - ./out/RANfunctionsIDcause-List.h \ - ./out/RANfunctionIDcause-Item.h \ - ./out/RICserviceUpdateFailure.h \ - ./out/RICserviceQuery.h \ - ./out/CauseE2.h \ - ./out/CauseMisc.h \ - ./out/CauseProtocol.h \ - ./out/CauseRIC.h \ - ./out/CauseRICservice.h \ - ./out/CauseTransport.h \ - ./out/CriticalityDiagnosticsE2.h \ - ./out/CriticalityDiagnostics-IE-ListE2.h \ - ./out/CriticalityDiagnostics-IE-ItemE2.h \ - ./out/ENB-ID.h \ - ./out/ENB-ID-Choice.h \ - ./out/ENGNB-ID.h \ - ./out/GlobalE2node-ID.h \ - ./out/GlobalE2node-en-gNB-ID.h \ - ./out/GlobalE2node-eNB-ID.h \ - ./out/GlobalE2node-gNB-ID.h \ - ./out/GlobalE2node-ng-eNB-ID.h \ - ./out/GlobalENB-ID.h \ - ./out/GlobalenGNB-ID.h \ - ./out/GlobalgNB-ID.h \ - ./out/GlobalngeNB-ID.h \ - ./out/GlobalRIC-ID.h \ - ./out/GNB-CU-UP-ID.h \ - ./out/GNB-DU-IDE2.h \ - ./out/GNB-ID-Choice.h \ - ./out/PLMN-IdentityE2.h \ - ./out/RANfunctionDefinition.h \ - ./out/RANfunctionID.h \ - ./out/RANfunctionRevision.h \ - ./out/RICactionDefinition.h \ - ./out/RICactionID.h \ - ./out/RICactionType.h \ - ./out/RICcallProcessID.h \ - ./out/RICcontrolAckRequest.h \ - ./out/RICcontrolHeader.h \ - ./out/RICcontrolMessage.h \ - ./out/RICcontrolOutcome.h \ - ./out/RICcontrolStatus.h \ - ./out/RICeventTriggerDefinition.h \ - ./out/RICindicationHeader.h \ - ./out/RICindicationMessage.h \ - ./out/RICindicationSN.h \ - ./out/RICindicationType.h \ - ./out/RICrequestID.h \ - ./out/RICsubsequentAction.h \ - ./out/RICsubsequentActionType.h \ - ./out/RICtimeToWait.h \ - ./out/TimeToWaitE2.h \ - ./out/TypeOfErrorE2.h \ - ./out/CriticalityE2.h \ - ./out/PresenceE2.h \ - ./out/ProcedureCodeE2.h \ - ./out/ProtocolIE-IDE2.h \ - ./out/TriggeringMessageE2.h \ - ./out/ProtocolIE-ContainerE2.h \ - ./out/ProtocolIE-SingleContainerE2.h \ - ./out/ProtocolIE-FieldE2.h \ - ./out/ProtocolIE-ContainerPairE2.h \ - ./out/ProtocolIE-FieldPairE2.h \ - ./out/ProtocolIE-ContainerList.h \ - ./out/ProtocolIE-ContainerPairList.h + ./newE2AP/E2AP-PDU.h \ + ./newE2AP/InitiatingMessageE2.h \ + ./newE2AP/SuccessfulOutcomeE2.h \ + ./newE2AP/UnsuccessfulOutcomeE2.h \ + ./newE2AP/RICsubscriptionRequest.h \ + ./newE2AP/RICsubscriptionDetails.h \ + ./newE2AP/RICactions-ToBeSetup-List.h \ + ./newE2AP/RICaction-ToBeSetup-Item.h \ + ./newE2AP/RICsubscriptionResponse.h \ + ./newE2AP/RICaction-Admitted-List.h \ + ./newE2AP/RICaction-Admitted-Item.h \ + ./newE2AP/RICaction-NotAdmitted-List.h \ + ./newE2AP/RICaction-NotAdmitted-Item.h \ + ./newE2AP/RICsubscriptionFailure.h \ + ./newE2AP/RICsubscriptionDeleteRequest.h \ + ./newE2AP/RICsubscriptionDeleteResponse.h \ + ./newE2AP/RICsubscriptionDeleteFailure.h \ + ./newE2AP/RICindication.h \ + ./newE2AP/RICcontrolRequest.h \ + ./newE2AP/RICcontrolAcknowledge.h \ + ./newE2AP/RICcontrolFailure.h \ + ./newE2AP/ErrorIndicationE2.h \ + ./newE2AP/E2setupRequest.h \ + ./newE2AP/E2setupResponse.h \ + ./newE2AP/E2setupFailure.h \ + ./newE2AP/ResetRequest.h \ + ./newE2AP/ResetResponse.h \ + ./newE2AP/RICserviceUpdate.h \ + ./newE2AP/RANfunctions-List.h \ + ./newE2AP/RANfunction-Item.h \ + ./newE2AP/RANfunctionsID-List.h \ + ./newE2AP/RANfunctionID-Item.h \ + ./newE2AP/RICserviceUpdateAcknowledge.h \ + ./newE2AP/RANfunctionsIDcause-List.h \ + ./newE2AP/RANfunctionIDcause-Item.h \ + ./newE2AP/RICserviceUpdateFailure.h \ + ./newE2AP/RICserviceQuery.h \ + ./newE2AP/CauseE2.h \ + ./newE2AP/CauseMisc.h \ + ./newE2AP/CauseProtocol.h \ + ./newE2AP/CauseRIC.h \ + ./newE2AP/CauseRICservice.h \ + ./newE2AP/CauseTransport.h \ + ./newE2AP/CriticalityDiagnosticsE2.h \ + ./newE2AP/CriticalityDiagnostics-IE-ListE2.h \ + ./newE2AP/CriticalityDiagnostics-IE-ItemE2.h \ + ./newE2AP/ENB-ID.h \ + ./newE2AP/ENB-ID-Choice.h \ + ./newE2AP/ENGNB-ID.h \ + ./newE2AP/GlobalE2node-ID.h \ + ./newE2AP/GlobalE2node-en-gNB-ID.h \ + ./newE2AP/GlobalE2node-eNB-ID.h \ + ./newE2AP/GlobalE2node-gNB-ID.h \ + ./newE2AP/GlobalE2node-ng-eNB-ID.h \ + ./newE2AP/GlobalENB-ID.h \ + ./newE2AP/GlobalenGNB-ID.h \ + ./newE2AP/GlobalgNB-ID.h \ + ./newE2AP/GlobalngeNB-ID.h \ + ./newE2AP/GlobalRIC-ID.h \ + ./newE2AP/GNB-CU-UP-ID.h \ + ./newE2AP/GNB-DU-IDE2.h \ + ./newE2AP/GNB-ID-Choice.h \ + ./newE2AP/PLMN-IdentityE2.h \ + ./newE2AP/RANfunctionDefinition.h \ + ./newE2AP/RANfunctionID.h \ + ./newE2AP/RANfunctionRevision.h \ + ./newE2AP/RICactionDefinition.h \ + ./newE2AP/RICactionID.h \ + ./newE2AP/RICactionType.h \ + ./newE2AP/RICcallProcessID.h \ + ./newE2AP/RICcontrolAckRequest.h \ + ./newE2AP/RICcontrolHeader.h \ + ./newE2AP/RICcontrolMessage.h \ + ./newE2AP/RICcontrolOutcome.h \ + ./newE2AP/RICcontrolStatus.h \ + ./newE2AP/RICeventTriggerDefinition.h \ + ./newE2AP/RICindicationHeader.h \ + ./newE2AP/RICindicationMessage.h \ + ./newE2AP/RICindicationSN.h \ + ./newE2AP/RICindicationType.h \ + ./newE2AP/RICrequestID.h \ + ./newE2AP/RICsubsequentAction.h \ + ./newE2AP/RICsubsequentActionType.h \ + ./newE2AP/RICtimeToWait.h \ + ./newE2AP/TimeToWaitE2.h \ + ./newE2AP/TypeOfErrorE2.h \ + ./newE2AP/CriticalityE2.h \ + ./newE2AP/PresenceE2.h \ + ./newE2AP/ProcedureCodeE2.h \ + ./newE2AP/ProtocolIE-IDE2.h \ + ./newE2AP/TriggeringMessageE2.h \ + ./newE2AP/ProtocolIE-ContainerE2.h \ + ./newE2AP/ProtocolIE-SingleContainerE2.h \ + ./newE2AP/ProtocolIE-FieldE2.h \ + ./newE2AP/ProtocolIE-ContainerPairE2.h \ + ./newE2AP/ProtocolIE-FieldPairE2.h \ + ./newE2AP/ProtocolIE-ContainerList.h \ + ./newE2AP/ProtocolIE-ContainerPairList.h -ASN_MODULE_HDRS+=./out/ANY.h -ASN_MODULE_SRCS+=./out/ANY.c -ASN_MODULE_HDRS+=./out/OCTET_STRING.h -ASN_MODULE_HDRS+=./out/OPEN_TYPE.h -ASN_MODULE_SRCS+=./out/OPEN_TYPE.c -ASN_MODULE_HDRS+=./out/constr_CHOICE.h -ASN_MODULE_HDRS+=./out/INTEGER.h -ASN_MODULE_SRCS+=./out/INTEGER.c -ASN_MODULE_HDRS+=./out/NativeEnumerated.h -ASN_MODULE_SRCS+=./out/NativeEnumerated.c -ASN_MODULE_HDRS+=./out/NativeInteger.h -ASN_MODULE_SRCS+=./out/NativeInteger.c -ASN_MODULE_HDRS+=./out/asn_SEQUENCE_OF.h -ASN_MODULE_SRCS+=./out/asn_SEQUENCE_OF.c -ASN_MODULE_HDRS+=./out/asn_SET_OF.h -ASN_MODULE_SRCS+=./out/asn_SET_OF.c -ASN_MODULE_SRCS+=./out/constr_CHOICE.c -ASN_MODULE_HDRS+=./out/constr_SEQUENCE.h -ASN_MODULE_SRCS+=./out/constr_SEQUENCE.c -ASN_MODULE_HDRS+=./out/constr_SEQUENCE_OF.h -ASN_MODULE_SRCS+=./out/constr_SEQUENCE_OF.c -ASN_MODULE_HDRS+=./out/constr_SET_OF.h -ASN_MODULE_SRCS+=./out/constr_SET_OF.c -ASN_MODULE_HDRS+=./out/asn_application.h -ASN_MODULE_SRCS+=./out/asn_application.c -ASN_MODULE_HDRS+=./out/asn_ioc.h -ASN_MODULE_HDRS+=./out/asn_system.h -ASN_MODULE_HDRS+=./out/asn_codecs.h -ASN_MODULE_HDRS+=./out/asn_internal.h -ASN_MODULE_SRCS+=./out/asn_internal.c -ASN_MODULE_HDRS+=./out/asn_random_fill.h -ASN_MODULE_SRCS+=./out/asn_random_fill.c -ASN_MODULE_HDRS+=./out/asn_bit_data.h -ASN_MODULE_SRCS+=./out/asn_bit_data.c -ASN_MODULE_SRCS+=./out/OCTET_STRING.c -ASN_MODULE_HDRS+=./out/BIT_STRING.h -ASN_MODULE_SRCS+=./out/BIT_STRING.c -ASN_MODULE_SRCS+=./out/asn_codecs_prim.c -ASN_MODULE_HDRS+=./out/asn_codecs_prim.h -ASN_MODULE_HDRS+=./out/ber_tlv_length.h -ASN_MODULE_SRCS+=./out/ber_tlv_length.c -ASN_MODULE_HDRS+=./out/ber_tlv_tag.h -ASN_MODULE_SRCS+=./out/ber_tlv_tag.c -ASN_MODULE_HDRS+=./out/ber_decoder.h -ASN_MODULE_SRCS+=./out/ber_decoder.c -ASN_MODULE_HDRS+=./out/der_encoder.h -ASN_MODULE_SRCS+=./out/der_encoder.c -ASN_MODULE_HDRS+=./out/constr_TYPE.h -ASN_MODULE_SRCS+=./out/constr_TYPE.c -ASN_MODULE_HDRS+=./out/constraints.h -ASN_MODULE_SRCS+=./out/constraints.c -ASN_MODULE_HDRS+=./out/xer_support.h -ASN_MODULE_SRCS+=./out/xer_support.c -ASN_MODULE_HDRS+=./out/xer_decoder.h -ASN_MODULE_SRCS+=./out/xer_decoder.c -ASN_MODULE_HDRS+=./out/xer_encoder.h -ASN_MODULE_SRCS+=./out/xer_encoder.c -ASN_MODULE_HDRS+=./out/per_support.h -ASN_MODULE_SRCS+=./out/per_support.c -ASN_MODULE_HDRS+=./out/per_decoder.h -ASN_MODULE_SRCS+=./out/per_decoder.c -ASN_MODULE_HDRS+=./out/per_encoder.h -ASN_MODULE_SRCS+=./out/per_encoder.c -ASN_MODULE_HDRS+=./out/per_opentype.h -ASN_MODULE_SRCS+=./out/per_opentype.c -ASN_MODULE_HDRS+=./out/oer_decoder.h -ASN_MODULE_HDRS+=./out/oer_encoder.h -ASN_MODULE_HDRS+=./out/oer_support.h -ASN_MODULE_SRCS+=./out/oer_decoder.c -ASN_MODULE_SRCS+=./out/oer_encoder.c -ASN_MODULE_SRCS+=./out/oer_support.c -ASN_MODULE_SRCS+=./out/OPEN_TYPE_oer.c -ASN_MODULE_SRCS+=./out/INTEGER_oer.c -ASN_MODULE_SRCS+=./out/BIT_STRING_oer.c -ASN_MODULE_SRCS+=./out/OCTET_STRING_oer.c -ASN_MODULE_SRCS+=./out/NativeInteger_oer.c -ASN_MODULE_SRCS+=./out/NativeEnumerated_oer.c -ASN_MODULE_SRCS+=./out/constr_CHOICE_oer.c -ASN_MODULE_SRCS+=./out/constr_SEQUENCE_oer.c -ASN_MODULE_SRCS+=./out/constr_SET_OF_oer.c +ASN_MODULE_HDRS+=./newE2AP/ANY.h +ASN_MODULE_SRCS+=./newE2AP/ANY.c +ASN_MODULE_HDRS+=./newE2AP/OCTET_STRING.h +ASN_MODULE_HDRS+=./newE2AP/OPEN_TYPE.h +ASN_MODULE_SRCS+=./newE2AP/OPEN_TYPE.c +ASN_MODULE_HDRS+=./newE2AP/constr_CHOICE.h +ASN_MODULE_HDRS+=./newE2AP/INTEGER.h +ASN_MODULE_SRCS+=./newE2AP/INTEGER.c +ASN_MODULE_HDRS+=./newE2AP/NativeEnumerated.h +ASN_MODULE_SRCS+=./newE2AP/NativeEnumerated.c +ASN_MODULE_HDRS+=./newE2AP/NativeInteger.h +ASN_MODULE_SRCS+=./newE2AP/NativeInteger.c +ASN_MODULE_HDRS+=./newE2AP/asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./newE2AP/asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./newE2AP/asn_SET_OF.h +ASN_MODULE_SRCS+=./newE2AP/asn_SET_OF.c +ASN_MODULE_SRCS+=./newE2AP/constr_CHOICE.c +ASN_MODULE_HDRS+=./newE2AP/constr_SEQUENCE.h +ASN_MODULE_SRCS+=./newE2AP/constr_SEQUENCE.c +ASN_MODULE_HDRS+=./newE2AP/constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./newE2AP/constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./newE2AP/constr_SET_OF.h +ASN_MODULE_SRCS+=./newE2AP/constr_SET_OF.c +ASN_MODULE_HDRS+=./newE2AP/asn_application.h +ASN_MODULE_SRCS+=./newE2AP/asn_application.c +ASN_MODULE_HDRS+=./newE2AP/asn_ioc.h +ASN_MODULE_HDRS+=./newE2AP/asn_system.h +ASN_MODULE_HDRS+=./newE2AP/asn_codecs.h +ASN_MODULE_HDRS+=./newE2AP/asn_internal.h +ASN_MODULE_SRCS+=./newE2AP/asn_internal.c +ASN_MODULE_HDRS+=./newE2AP/asn_random_fill.h +ASN_MODULE_SRCS+=./newE2AP/asn_random_fill.c +ASN_MODULE_HDRS+=./newE2AP/asn_bit_data.h +ASN_MODULE_SRCS+=./newE2AP/asn_bit_data.c +ASN_MODULE_SRCS+=./newE2AP/OCTET_STRING.c +ASN_MODULE_HDRS+=./newE2AP/BIT_STRING.h +ASN_MODULE_SRCS+=./newE2AP/BIT_STRING.c +ASN_MODULE_SRCS+=./newE2AP/asn_codecs_prim.c +ASN_MODULE_HDRS+=./newE2AP/asn_codecs_prim.h +ASN_MODULE_HDRS+=./newE2AP/ber_tlv_length.h +ASN_MODULE_SRCS+=./newE2AP/ber_tlv_length.c +ASN_MODULE_HDRS+=./newE2AP/ber_tlv_tag.h +ASN_MODULE_SRCS+=./newE2AP/ber_tlv_tag.c +ASN_MODULE_HDRS+=./newE2AP/ber_decoder.h +ASN_MODULE_SRCS+=./newE2AP/ber_decoder.c +ASN_MODULE_HDRS+=./newE2AP/der_encoder.h +ASN_MODULE_SRCS+=./newE2AP/der_encoder.c +ASN_MODULE_HDRS+=./newE2AP/constr_TYPE.h +ASN_MODULE_SRCS+=./newE2AP/constr_TYPE.c +ASN_MODULE_HDRS+=./newE2AP/constraints.h +ASN_MODULE_SRCS+=./newE2AP/constraints.c +ASN_MODULE_HDRS+=./newE2AP/xer_support.h +ASN_MODULE_SRCS+=./newE2AP/xer_support.c +ASN_MODULE_HDRS+=./newE2AP/xer_decoder.h +ASN_MODULE_SRCS+=./newE2AP/xer_decoder.c +ASN_MODULE_HDRS+=./newE2AP/xer_encoder.h +ASN_MODULE_SRCS+=./newE2AP/xer_encoder.c +ASN_MODULE_HDRS+=./newE2AP/per_support.h +ASN_MODULE_SRCS+=./newE2AP/per_support.c +ASN_MODULE_HDRS+=./newE2AP/per_decoder.h +ASN_MODULE_SRCS+=./newE2AP/per_decoder.c +ASN_MODULE_HDRS+=./newE2AP/per_encoder.h +ASN_MODULE_SRCS+=./newE2AP/per_encoder.c +ASN_MODULE_HDRS+=./newE2AP/per_opentype.h +ASN_MODULE_SRCS+=./newE2AP/per_opentype.c +ASN_MODULE_HDRS+=./newE2AP/oer_decoder.h +ASN_MODULE_HDRS+=./newE2AP/oer_encoder.h +ASN_MODULE_HDRS+=./newE2AP/oer_support.h +ASN_MODULE_SRCS+=./newE2AP/oer_decoder.c +ASN_MODULE_SRCS+=./newE2AP/oer_encoder.c +ASN_MODULE_SRCS+=./newE2AP/oer_support.c +ASN_MODULE_SRCS+=./newE2AP/OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=./newE2AP/INTEGER_oer.c +ASN_MODULE_SRCS+=./newE2AP/BIT_STRING_oer.c +ASN_MODULE_SRCS+=./newE2AP/OCTET_STRING_oer.c +ASN_MODULE_SRCS+=./newE2AP/NativeInteger_oer.c +ASN_MODULE_SRCS+=./newE2AP/NativeEnumerated_oer.c +ASN_MODULE_SRCS+=./newE2AP/constr_CHOICE_oer.c +ASN_MODULE_SRCS+=./newE2AP/constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=./newE2AP/constr_SET_OF_oer.c ASN_MODULE_CFLAGS= lib_LTLIBRARIES+=libasncodec.la libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) -libasncodec_la_CPPFLAGS=-I$(top_srcdir)/./out/ +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/./newE2AP/ libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) libasncodec_la_LDFLAGS=-lm diff --git a/src/codec_utils/E2AP/PLMN-IdentityE2.c b/src/codec_utils/E2AP/PLMN-IdentityE2.c index 800a2163a..3ac3d14c8 100644 --- a/src/codec_utils/E2AP/PLMN-IdentityE2.c +++ b/src/codec_utils/E2AP/PLMN-IdentityE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "PLMN-IdentityE2.h" diff --git a/src/codec_utils/E2AP/PLMN-IdentityE2.h b/src/codec_utils/E2AP/PLMN-IdentityE2.h index 44d0cd2c6..4fe496d49 100644 --- a/src/codec_utils/E2AP/PLMN-IdentityE2.h +++ b/src/codec_utils/E2AP/PLMN-IdentityE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _PLMN_IdentityE2_H_ diff --git a/src/codec_utils/E2AP/PresenceE2.c b/src/codec_utils/E2AP/PresenceE2.c index 9ce3b2b91..0c119d508 100644 --- a/src/codec_utils/E2AP/PresenceE2.c +++ b/src/codec_utils/E2AP/PresenceE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "PresenceE2.h" diff --git a/src/codec_utils/E2AP/PresenceE2.h b/src/codec_utils/E2AP/PresenceE2.h index 8ab9ca2d6..3761d9a1f 100644 --- a/src/codec_utils/E2AP/PresenceE2.h +++ b/src/codec_utils/E2AP/PresenceE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _PresenceE2_H_ diff --git a/src/codec_utils/E2AP/ProcedureCodeE2.c b/src/codec_utils/E2AP/ProcedureCodeE2.c index a9335b871..db4a8a7cc 100644 --- a/src/codec_utils/E2AP/ProcedureCodeE2.c +++ b/src/codec_utils/E2AP/ProcedureCodeE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProcedureCodeE2.h" diff --git a/src/codec_utils/E2AP/ProcedureCodeE2.h b/src/codec_utils/E2AP/ProcedureCodeE2.h index bf85b9ba1..7d1465802 100644 --- a/src/codec_utils/E2AP/ProcedureCodeE2.h +++ b/src/codec_utils/E2AP/ProcedureCodeE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProcedureCodeE2_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerE2.c b/src/codec_utils/E2AP/ProtocolIE-ContainerE2.c index 3c6446b8d..b7fed331c 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerE2.c @@ -1,174 +1,174 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-ContainerE2.h" #include "ProtocolIE-FieldE2.h" -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P0_constr_1 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P0_constr_1 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P1_constr_3 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P1_constr_3 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P2_constr_5 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P2_constr_5 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P3_constr_7 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P3_constr_7 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P4_constr_9 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P4_constr_9 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P5_constr_11 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P5_constr_11 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P6_constr_13 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P6_constr_13 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P7_constr_15 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P7_constr_15 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P8_constr_17 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P8_constr_17 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P9_constr_19 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P9_constr_19 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P10_constr_21 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P10_constr_21 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P11_constr_23 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P11_constr_23 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P12_constr_25 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P12_constr_25 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P13_constr_27 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P13_constr_27 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P14_constr_29 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P14_constr_29 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P15_constr_31 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P15_constr_31 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P16_constr_33 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P16_constr_33 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P17_constr_35 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P17_constr_35 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P18_constr_37 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P18_constr_37 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1405P19_constr_39 CC_NOTUSED = { { 0, 0 }, -1 /* (SIZE(0..65535)) */}; -asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P19_constr_39 CC_NOTUSED = { { APC_UNCONSTRAINED, -1, -1, 0, 0 }, { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, 0, 0 /* No PER value map */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P0_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -179,31 +179,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 = { - sizeof(struct ProtocolIE_ContainerE2_1407P0), - offsetof(struct ProtocolIE_ContainerE2_1407P0, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P0_specs_1 = { + sizeof(struct ProtocolIE_ContainerE2_1405P0), + offsetof(struct ProtocolIE_ContainerE2_1405P0, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P0 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1, &asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P0_1, + asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P0_tags_1[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P0_constr_1, &asn_PER_type_ProtocolIE_ContainerE2_1405P0_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P0_1, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P0_specs_1 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P1_3[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -214,31 +214,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 = { - sizeof(struct ProtocolIE_ContainerE2_1407P1), - offsetof(struct ProtocolIE_ContainerE2_1407P1, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P1_specs_3 = { + sizeof(struct ProtocolIE_ContainerE2_1405P1), + offsetof(struct ProtocolIE_ContainerE2_1405P1, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P1 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3, &asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P1_3, + asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P1_tags_3[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P1_constr_3, &asn_PER_type_ProtocolIE_ContainerE2_1405P1_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P1_3, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P1_specs_3 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P2_5[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -249,31 +249,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 = { - sizeof(struct ProtocolIE_ContainerE2_1407P2), - offsetof(struct ProtocolIE_ContainerE2_1407P2, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P2_specs_5 = { + sizeof(struct ProtocolIE_ContainerE2_1405P2), + offsetof(struct ProtocolIE_ContainerE2_1405P2, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P2 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5, &asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P2_5, + asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P2_tags_5[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P2_constr_5, &asn_PER_type_ProtocolIE_ContainerE2_1405P2_constr_5, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P2_5, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P2_specs_5 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P3_7[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -284,31 +284,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 = { - sizeof(struct ProtocolIE_ContainerE2_1407P3), - offsetof(struct ProtocolIE_ContainerE2_1407P3, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P3_specs_7 = { + sizeof(struct ProtocolIE_ContainerE2_1405P3), + offsetof(struct ProtocolIE_ContainerE2_1405P3, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P3 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7, &asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P3_7, + asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P3_tags_7[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P3_constr_7, &asn_PER_type_ProtocolIE_ContainerE2_1405P3_constr_7, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P3_7, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P3_specs_7 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P4_9[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -319,31 +319,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 = { - sizeof(struct ProtocolIE_ContainerE2_1407P4), - offsetof(struct ProtocolIE_ContainerE2_1407P4, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P4_specs_9 = { + sizeof(struct ProtocolIE_ContainerE2_1405P4), + offsetof(struct ProtocolIE_ContainerE2_1405P4, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P4 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9, &asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P4_9, + asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P4_tags_9[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P4_constr_9, &asn_PER_type_ProtocolIE_ContainerE2_1405P4_constr_9, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P4_9, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P4_specs_9 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P5_11[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -354,31 +354,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 = { - sizeof(struct ProtocolIE_ContainerE2_1407P5), - offsetof(struct ProtocolIE_ContainerE2_1407P5, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P5_specs_11 = { + sizeof(struct ProtocolIE_ContainerE2_1405P5), + offsetof(struct ProtocolIE_ContainerE2_1405P5, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P5 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11, &asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P5_11, + asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P5_tags_11[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P5_constr_11, &asn_PER_type_ProtocolIE_ContainerE2_1405P5_constr_11, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P5_11, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P5_specs_11 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P6_13[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -389,31 +389,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 = { - sizeof(struct ProtocolIE_ContainerE2_1407P6), - offsetof(struct ProtocolIE_ContainerE2_1407P6, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P6_specs_13 = { + sizeof(struct ProtocolIE_ContainerE2_1405P6), + offsetof(struct ProtocolIE_ContainerE2_1405P6, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P6 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13, &asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P6_13, + asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P6_tags_13[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P6_constr_13, &asn_PER_type_ProtocolIE_ContainerE2_1405P6_constr_13, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P6_13, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P6_specs_13 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P7_15[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -424,31 +424,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 = { - sizeof(struct ProtocolIE_ContainerE2_1407P7), - offsetof(struct ProtocolIE_ContainerE2_1407P7, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P7_specs_15 = { + sizeof(struct ProtocolIE_ContainerE2_1405P7), + offsetof(struct ProtocolIE_ContainerE2_1405P7, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P7 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15, &asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P7_15, + asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P7_tags_15[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P7_constr_15, &asn_PER_type_ProtocolIE_ContainerE2_1405P7_constr_15, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P7_15, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P7_specs_15 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P8_17[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -459,31 +459,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 = { - sizeof(struct ProtocolIE_ContainerE2_1407P8), - offsetof(struct ProtocolIE_ContainerE2_1407P8, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P8_specs_17 = { + sizeof(struct ProtocolIE_ContainerE2_1405P8), + offsetof(struct ProtocolIE_ContainerE2_1405P8, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P8 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17, &asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P8_17, + asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P8_tags_17[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P8_constr_17, &asn_PER_type_ProtocolIE_ContainerE2_1405P8_constr_17, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P8_17, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P8_specs_17 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P9_19[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -494,31 +494,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 = { - sizeof(struct ProtocolIE_ContainerE2_1407P9), - offsetof(struct ProtocolIE_ContainerE2_1407P9, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P9_specs_19 = { + sizeof(struct ProtocolIE_ContainerE2_1405P9), + offsetof(struct ProtocolIE_ContainerE2_1405P9, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P9 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19, &asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P9_19, + asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P9_tags_19[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P9_constr_19, &asn_PER_type_ProtocolIE_ContainerE2_1405P9_constr_19, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P9_19, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P9_specs_19 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P10_21[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -529,31 +529,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 = { - sizeof(struct ProtocolIE_ContainerE2_1407P10), - offsetof(struct ProtocolIE_ContainerE2_1407P10, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P10_specs_21 = { + sizeof(struct ProtocolIE_ContainerE2_1405P10), + offsetof(struct ProtocolIE_ContainerE2_1405P10, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P10 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21, &asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P10_21, + asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P10_tags_21[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P10_constr_21, &asn_PER_type_ProtocolIE_ContainerE2_1405P10_constr_21, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P10_21, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P10_specs_21 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P11_23[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -564,31 +564,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 = { - sizeof(struct ProtocolIE_ContainerE2_1407P11), - offsetof(struct ProtocolIE_ContainerE2_1407P11, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P11_specs_23 = { + sizeof(struct ProtocolIE_ContainerE2_1405P11), + offsetof(struct ProtocolIE_ContainerE2_1405P11, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P11 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23, &asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P11_23, + asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P11_tags_23[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P11_constr_23, &asn_PER_type_ProtocolIE_ContainerE2_1405P11_constr_23, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P11_23, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P11_specs_23 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P12_25[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -599,31 +599,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 = { - sizeof(struct ProtocolIE_ContainerE2_1407P12), - offsetof(struct ProtocolIE_ContainerE2_1407P12, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P12_specs_25 = { + sizeof(struct ProtocolIE_ContainerE2_1405P12), + offsetof(struct ProtocolIE_ContainerE2_1405P12, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P12 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25, &asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P12_25, + asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P12_tags_25[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P12_constr_25, &asn_PER_type_ProtocolIE_ContainerE2_1405P12_constr_25, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P12_25, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P12_specs_25 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P13_27[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -634,31 +634,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 = { - sizeof(struct ProtocolIE_ContainerE2_1407P13), - offsetof(struct ProtocolIE_ContainerE2_1407P13, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P13_specs_27 = { + sizeof(struct ProtocolIE_ContainerE2_1405P13), + offsetof(struct ProtocolIE_ContainerE2_1405P13, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P13 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27, &asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P13_27, + asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P13_tags_27[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P13_constr_27, &asn_PER_type_ProtocolIE_ContainerE2_1405P13_constr_27, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P13_27, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P13_specs_27 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P14_29[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -669,31 +669,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 = { - sizeof(struct ProtocolIE_ContainerE2_1407P14), - offsetof(struct ProtocolIE_ContainerE2_1407P14, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P14_specs_29 = { + sizeof(struct ProtocolIE_ContainerE2_1405P14), + offsetof(struct ProtocolIE_ContainerE2_1405P14, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P14 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29, &asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P14_29, + asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P14_tags_29[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P14_constr_29, &asn_PER_type_ProtocolIE_ContainerE2_1405P14_constr_29, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P14_29, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P14_specs_29 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P15_31[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -704,31 +704,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 = { - sizeof(struct ProtocolIE_ContainerE2_1407P15), - offsetof(struct ProtocolIE_ContainerE2_1407P15, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P15_specs_31 = { + sizeof(struct ProtocolIE_ContainerE2_1405P15), + offsetof(struct ProtocolIE_ContainerE2_1405P15, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P15 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31, &asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P15_31, + asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P15_tags_31[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P15_constr_31, &asn_PER_type_ProtocolIE_ContainerE2_1405P15_constr_31, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P15_31, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P15_specs_31 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P16_33[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -739,31 +739,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 = { - sizeof(struct ProtocolIE_ContainerE2_1407P16), - offsetof(struct ProtocolIE_ContainerE2_1407P16, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P16_specs_33 = { + sizeof(struct ProtocolIE_ContainerE2_1405P16), + offsetof(struct ProtocolIE_ContainerE2_1405P16, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P16 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33, &asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P16_33, + asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P16_tags_33[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P16_constr_33, &asn_PER_type_ProtocolIE_ContainerE2_1405P16_constr_33, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P16_33, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P16_specs_33 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P17_35[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -774,31 +774,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 = { - sizeof(struct ProtocolIE_ContainerE2_1407P17), - offsetof(struct ProtocolIE_ContainerE2_1407P17, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P17_specs_35 = { + sizeof(struct ProtocolIE_ContainerE2_1405P17), + offsetof(struct ProtocolIE_ContainerE2_1405P17, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P17 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35, &asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P17_35, + asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P17_tags_35[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P17_constr_35, &asn_PER_type_ProtocolIE_ContainerE2_1405P17_constr_35, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P17_35, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P17_specs_35 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P18_37[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -809,31 +809,31 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 = { - sizeof(struct ProtocolIE_ContainerE2_1407P18), - offsetof(struct ProtocolIE_ContainerE2_1407P18, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P18_specs_37 = { + sizeof(struct ProtocolIE_ContainerE2_1405P18), + offsetof(struct ProtocolIE_ContainerE2_1405P18, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P18 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37, &asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P18_37, + asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P18_tags_37[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P18_constr_37, &asn_PER_type_ProtocolIE_ContainerE2_1405P18_constr_37, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P18_37, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P18_specs_37 /* Additional specs */ }; -asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[] = { +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P19_39[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, @@ -844,27 +844,27 @@ asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[] = { "" }, }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 = { - sizeof(struct ProtocolIE_ContainerE2_1407P19), - offsetof(struct ProtocolIE_ContainerE2_1407P19, _asn_ctx), +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P19_specs_39 = { + sizeof(struct ProtocolIE_ContainerE2_1405P19), + offsetof(struct ProtocolIE_ContainerE2_1405P19, _asn_ctx), 0, /* XER encoding is XMLDelimitedItemList */ }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P19 = { "ProtocolIE-ContainerE2", "ProtocolIE-ContainerE2", &asn_OP_SEQUENCE_OF, - asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ - asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) - /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ - { &asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39, &asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39, SEQUENCE_OF_constraint }, - asn_MBR_ProtocolIE_ContainerE2_1407P19_39, + asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1405P19_tags_39[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1405P19_constr_39, &asn_PER_type_ProtocolIE_ContainerE2_1405P19_constr_39, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1405P19_39, 1, /* Single element */ - &asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 /* Additional specs */ + &asn_SPC_ProtocolIE_ContainerE2_1405P19_specs_39 /* Additional specs */ }; diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerE2.h b/src/codec_utils/E2AP/ProtocolIE-ContainerE2.h index 7da7246c9..f1ba7f187 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_ContainerE2_H_ @@ -42,208 +42,208 @@ struct RICserviceUpdateFailure_IEs; struct RICserviceQuery_IEs; /* ProtocolIE-ContainerE2 */ -typedef struct ProtocolIE_ContainerE2_1407P0 { +typedef struct ProtocolIE_ContainerE2_1405P0 { A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P0_t; -typedef struct ProtocolIE_ContainerE2_1407P1 { +} ProtocolIE_ContainerE2_1405P0_t; +typedef struct ProtocolIE_ContainerE2_1405P1 { A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P1_t; -typedef struct ProtocolIE_ContainerE2_1407P2 { +} ProtocolIE_ContainerE2_1405P1_t; +typedef struct ProtocolIE_ContainerE2_1405P2 { A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P2_t; -typedef struct ProtocolIE_ContainerE2_1407P3 { +} ProtocolIE_ContainerE2_1405P2_t; +typedef struct ProtocolIE_ContainerE2_1405P3 { A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P3_t; -typedef struct ProtocolIE_ContainerE2_1407P4 { +} ProtocolIE_ContainerE2_1405P3_t; +typedef struct ProtocolIE_ContainerE2_1405P4 { A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P4_t; -typedef struct ProtocolIE_ContainerE2_1407P5 { +} ProtocolIE_ContainerE2_1405P4_t; +typedef struct ProtocolIE_ContainerE2_1405P5 { A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P5_t; -typedef struct ProtocolIE_ContainerE2_1407P6 { +} ProtocolIE_ContainerE2_1405P5_t; +typedef struct ProtocolIE_ContainerE2_1405P6 { A_SEQUENCE_OF(struct RICindication_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P6_t; -typedef struct ProtocolIE_ContainerE2_1407P7 { +} ProtocolIE_ContainerE2_1405P6_t; +typedef struct ProtocolIE_ContainerE2_1405P7 { A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P7_t; -typedef struct ProtocolIE_ContainerE2_1407P8 { +} ProtocolIE_ContainerE2_1405P7_t; +typedef struct ProtocolIE_ContainerE2_1405P8 { A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P8_t; -typedef struct ProtocolIE_ContainerE2_1407P9 { +} ProtocolIE_ContainerE2_1405P8_t; +typedef struct ProtocolIE_ContainerE2_1405P9 { A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P9_t; -typedef struct ProtocolIE_ContainerE2_1407P10 { +} ProtocolIE_ContainerE2_1405P9_t; +typedef struct ProtocolIE_ContainerE2_1405P10 { A_SEQUENCE_OF(struct ErrorIndicationE2_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P10_t; -typedef struct ProtocolIE_ContainerE2_1407P11 { +} ProtocolIE_ContainerE2_1405P10_t; +typedef struct ProtocolIE_ContainerE2_1405P11 { A_SEQUENCE_OF(struct E2setupRequestIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P11_t; -typedef struct ProtocolIE_ContainerE2_1407P12 { +} ProtocolIE_ContainerE2_1405P11_t; +typedef struct ProtocolIE_ContainerE2_1405P12 { A_SEQUENCE_OF(struct E2setupResponseIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P12_t; -typedef struct ProtocolIE_ContainerE2_1407P13 { +} ProtocolIE_ContainerE2_1405P12_t; +typedef struct ProtocolIE_ContainerE2_1405P13 { A_SEQUENCE_OF(struct E2setupFailureIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P13_t; -typedef struct ProtocolIE_ContainerE2_1407P14 { +} ProtocolIE_ContainerE2_1405P13_t; +typedef struct ProtocolIE_ContainerE2_1405P14 { A_SEQUENCE_OF(struct ResetRequestIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P14_t; -typedef struct ProtocolIE_ContainerE2_1407P15 { +} ProtocolIE_ContainerE2_1405P14_t; +typedef struct ProtocolIE_ContainerE2_1405P15 { A_SEQUENCE_OF(struct ResetResponseIEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P15_t; -typedef struct ProtocolIE_ContainerE2_1407P16 { +} ProtocolIE_ContainerE2_1405P15_t; +typedef struct ProtocolIE_ContainerE2_1405P16 { A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P16_t; -typedef struct ProtocolIE_ContainerE2_1407P17 { +} ProtocolIE_ContainerE2_1405P16_t; +typedef struct ProtocolIE_ContainerE2_1405P17 { A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P17_t; -typedef struct ProtocolIE_ContainerE2_1407P18 { +} ProtocolIE_ContainerE2_1405P17_t; +typedef struct ProtocolIE_ContainerE2_1405P18 { A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P18_t; -typedef struct ProtocolIE_ContainerE2_1407P19 { +} ProtocolIE_ContainerE2_1405P18_t; +typedef struct ProtocolIE_ContainerE2_1405P19 { A_SEQUENCE_OF(struct RICserviceQuery_IEs) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; -} ProtocolIE_ContainerE2_1407P19_t; +} ProtocolIE_ContainerE2_1405P19_t; /* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19; -extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39; -extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[1]; -extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P0; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P0_specs_1; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P0_1[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P0_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P1; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P1_specs_3; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P1_3[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P1_constr_3; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P2; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P2_specs_5; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P2_5[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P2_constr_5; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P3; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P3_specs_7; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P3_7[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P3_constr_7; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P4; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P4_specs_9; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P4_9[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P4_constr_9; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P5; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P5_specs_11; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P5_11[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P5_constr_11; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P6; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P6_specs_13; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P6_13[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P6_constr_13; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P7; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P7_specs_15; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P7_15[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P7_constr_15; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P8; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P8_specs_17; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P8_17[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P8_constr_17; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P9; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P9_specs_19; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P9_19[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P9_constr_19; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P10; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P10_specs_21; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P10_21[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P10_constr_21; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P11; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P11_specs_23; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P11_23[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P11_constr_23; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P12; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P12_specs_25; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P12_25[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P12_constr_25; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P13; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P13_specs_27; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P13_27[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P13_constr_27; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P14; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P14_specs_29; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P14_29[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P14_constr_29; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P15; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P15_specs_31; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P15_31[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P15_constr_31; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P16; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P16_specs_33; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P16_33[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P16_constr_33; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P17; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P17_specs_35; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P17_35[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P17_constr_35; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P18; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P18_specs_37; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P18_37[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P18_constr_37; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1405P19; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1405P19_specs_39; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1405P19_39[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1405P19_constr_39; #ifdef __cplusplus } diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerList.c b/src/codec_utils/E2AP/ProtocolIE-ContainerList.c index 3b9b894d0..bc60098e7 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerList.c +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerList.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-ContainerList.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerList.h b/src/codec_utils/E2AP/ProtocolIE-ContainerList.h index e3aca2bf6..69584c536 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerList.h +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_ContainerList_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.c b/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.c index ea31cdb45..00cf4216d 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-ContainerPairE2.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.h b/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.h index 9157d114d..688965cdc 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerPairE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_ContainerPairE2_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.c b/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.c index e43c23120..48320a2ea 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.c +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-ContainerPairList.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.h b/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.h index e5aff3e05..8f5d4f236 100644 --- a/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.h +++ b/src/codec_utils/E2AP/ProtocolIE-ContainerPairList.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_ContainerPairList_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-FieldE2.c b/src/codec_utils/E2AP/ProtocolIE-FieldE2.c index d287458e1..e6284a93e 100644 --- a/src/codec_utils/E2AP/ProtocolIE-FieldE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-FieldE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-FieldE2.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-FieldE2.h b/src/codec_utils/E2AP/ProtocolIE-FieldE2.h index dd6583ec3..36401d0ba 100644 --- a/src/codec_utils/E2AP/ProtocolIE-FieldE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-FieldE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_FieldE2_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.c b/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.c index 97f27971e..5f6c8880a 100644 --- a/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-FieldPairE2.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.h b/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.h index bc44c61cd..8753c0b6e 100644 --- a/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-FieldPairE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_FieldPairE2_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-IDE2.c b/src/codec_utils/E2AP/ProtocolIE-IDE2.c index 7e14d9a1e..db3bba2af 100644 --- a/src/codec_utils/E2AP/ProtocolIE-IDE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-IDE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-IDE2.h" diff --git a/src/codec_utils/E2AP/ProtocolIE-IDE2.h b/src/codec_utils/E2AP/ProtocolIE-IDE2.h index 467b6eb2a..4d22013df 100644 --- a/src/codec_utils/E2AP/ProtocolIE-IDE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-IDE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_IDE2_H_ diff --git a/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.c b/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.c index e5f3df3fe..809d3ea91 100644 --- a/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.c +++ b/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ProtocolIE-SingleContainerE2.h" @@ -31,114 +31,114 @@ * This type is implemented using RANfunctionIDcause_ItemIEs, * so here we adjust the DEF accordingly. */ -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P0 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P0_tags_1[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RICaction_ToBeSetup_ItemIEs_1, 3, /* Elements count */ &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P1 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P1_tags_2[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RICaction_Admitted_ItemIEs_5, 3, /* Elements count */ &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P2 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P2_tags_3[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RICaction_NotAdmitted_ItemIEs_9, 3, /* Elements count */ &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P3 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P3_tags_4[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RANfunction_ItemIEs_13, 3, /* Elements count */ &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P4 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P4_tags_5[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RANfunctionID_ItemIEs_17, 3, /* Elements count */ &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ }; -static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[] = { +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6[] = { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) }; -asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5 = { +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P5 = { "ProtocolIE-SingleContainerE2", "ProtocolIE-SingleContainerE2", &asn_OP_SEQUENCE, - asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ - asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, /* Same as above */ - sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) - /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1408P5_tags_6[0]), /* 1 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_RANfunctionIDcause_ItemIEs_21, 3, /* Elements count */ diff --git a/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.h b/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.h index 8ce37aa60..27796d2e2 100644 --- a/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.h +++ b/src/codec_utils/E2AP/ProtocolIE-SingleContainerE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-Containers" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ProtocolIE_SingleContainerE2_H_ @@ -19,98 +19,98 @@ extern "C" { #endif /* ProtocolIE-SingleContainerE2 */ -typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainerE2_1410P0_t; -typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P1_t; -typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P2_t; -typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainerE2_1410P3_t; -typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainerE2_1410P4_t; -typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainerE2_1410P5_t; +typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainerE2_1408P0_t; +typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainerE2_1408P1_t; +typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainerE2_1408P2_t; +typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainerE2_1408P3_t; +typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainerE2_1408P4_t; +typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainerE2_1408P5_t; /* Implementation */ -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P0_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P0_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P0_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P1_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P1_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P1_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P2_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P2_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P2_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P3_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P3_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P3_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P4_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P4_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P4_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_aper; -extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5; -asn_struct_free_f ProtocolIE_SingleContainerE2_1410P5_free; -asn_struct_print_f ProtocolIE_SingleContainerE2_1410P5_print; -asn_constr_check_f ProtocolIE_SingleContainerE2_1410P5_constraint; -ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_ber; -der_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_der; -xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_xer; -xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_xer; -oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_oer; -oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_oer; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_uper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_uper; -per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_aper; -per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P0; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P0_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P0_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P0_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P0_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P0_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P0_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P0_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P0_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P0_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P0_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P0_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P0_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P0_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P1; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P1_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P1_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P1_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P1_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P1_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P1_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P1_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P1_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P1_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P1_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P1_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P1_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P1_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P2; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P2_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P2_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P2_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P2_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P2_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P2_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P2_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P2_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P2_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P2_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P2_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P2_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P2_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P3; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P3_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P3_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P3_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P3_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P3_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P3_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P3_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P3_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P3_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P3_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P3_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P3_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P3_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P4; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P4_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P4_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P4_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P4_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P4_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P4_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P4_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P4_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P4_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P4_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P4_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P4_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P4_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1408P5; +asn_struct_free_f ProtocolIE_SingleContainerE2_1408P5_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1408P5_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1408P5_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1408P5_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1408P5_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1408P5_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1408P5_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1408P5_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1408P5_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P5_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P5_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1408P5_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1408P5_encode_aper; #ifdef __cplusplus } diff --git a/src/codec_utils/E2AP/RANfunction-Item.c b/src/codec_utils/E2AP/RANfunction-Item.c index bf53aca18..b1ef2e02f 100644 --- a/src/codec_utils/E2AP/RANfunction-Item.c +++ b/src/codec_utils/E2AP/RANfunction-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunction-Item.h" diff --git a/src/codec_utils/E2AP/RANfunction-Item.h b/src/codec_utils/E2AP/RANfunction-Item.h index 5e2eb14c8..89a3a89ac 100644 --- a/src/codec_utils/E2AP/RANfunction-Item.h +++ b/src/codec_utils/E2AP/RANfunction-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunction_Item_H_ diff --git a/src/codec_utils/E2AP/RANfunctionDefinition.c b/src/codec_utils/E2AP/RANfunctionDefinition.c index bc0a7ccef..4bdd485e0 100644 --- a/src/codec_utils/E2AP/RANfunctionDefinition.c +++ b/src/codec_utils/E2AP/RANfunctionDefinition.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionDefinition.h" diff --git a/src/codec_utils/E2AP/RANfunctionDefinition.h b/src/codec_utils/E2AP/RANfunctionDefinition.h index 2329fe6ca..ba4804996 100644 --- a/src/codec_utils/E2AP/RANfunctionDefinition.h +++ b/src/codec_utils/E2AP/RANfunctionDefinition.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionDefinition_H_ diff --git a/src/codec_utils/E2AP/RANfunctionID-Item.c b/src/codec_utils/E2AP/RANfunctionID-Item.c index 53bea0aa4..6e36334d7 100644 --- a/src/codec_utils/E2AP/RANfunctionID-Item.c +++ b/src/codec_utils/E2AP/RANfunctionID-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionID-Item.h" diff --git a/src/codec_utils/E2AP/RANfunctionID-Item.h b/src/codec_utils/E2AP/RANfunctionID-Item.h index a787c712f..21baca8f5 100644 --- a/src/codec_utils/E2AP/RANfunctionID-Item.h +++ b/src/codec_utils/E2AP/RANfunctionID-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionID_Item_H_ diff --git a/src/codec_utils/E2AP/RANfunctionID.c b/src/codec_utils/E2AP/RANfunctionID.c index dc77a8213..10215831b 100644 --- a/src/codec_utils/E2AP/RANfunctionID.c +++ b/src/codec_utils/E2AP/RANfunctionID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionID.h" diff --git a/src/codec_utils/E2AP/RANfunctionID.h b/src/codec_utils/E2AP/RANfunctionID.h index 3e1c08e43..4b203a62e 100644 --- a/src/codec_utils/E2AP/RANfunctionID.h +++ b/src/codec_utils/E2AP/RANfunctionID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionID_H_ diff --git a/src/codec_utils/E2AP/RANfunctionIDcause-Item.c b/src/codec_utils/E2AP/RANfunctionIDcause-Item.c index 64c6782ae..1e59ed7fe 100644 --- a/src/codec_utils/E2AP/RANfunctionIDcause-Item.c +++ b/src/codec_utils/E2AP/RANfunctionIDcause-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionIDcause-Item.h" diff --git a/src/codec_utils/E2AP/RANfunctionIDcause-Item.h b/src/codec_utils/E2AP/RANfunctionIDcause-Item.h index f967404be..d881dfd15 100644 --- a/src/codec_utils/E2AP/RANfunctionIDcause-Item.h +++ b/src/codec_utils/E2AP/RANfunctionIDcause-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionIDcause_Item_H_ diff --git a/src/codec_utils/E2AP/RANfunctionRevision.c b/src/codec_utils/E2AP/RANfunctionRevision.c index 46215d699..11f03e62d 100644 --- a/src/codec_utils/E2AP/RANfunctionRevision.c +++ b/src/codec_utils/E2AP/RANfunctionRevision.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionRevision.h" diff --git a/src/codec_utils/E2AP/RANfunctionRevision.h b/src/codec_utils/E2AP/RANfunctionRevision.h index f31677084..3ad4b5cb4 100644 --- a/src/codec_utils/E2AP/RANfunctionRevision.h +++ b/src/codec_utils/E2AP/RANfunctionRevision.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionRevision_H_ diff --git a/src/codec_utils/E2AP/RANfunctions-List.c b/src/codec_utils/E2AP/RANfunctions-List.c index 6414f6c93..fb4fa27da 100644 --- a/src/codec_utils/E2AP/RANfunctions-List.c +++ b/src/codec_utils/E2AP/RANfunctions-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctions-List.h" @@ -20,7 +20,7 @@ static asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P3, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P3, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RANfunctions-List.h b/src/codec_utils/E2AP/RANfunctions-List.h index e90722b42..3a0359a47 100644 --- a/src/codec_utils/E2AP/RANfunctions-List.h +++ b/src/codec_utils/E2AP/RANfunctions-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctions_List_H_ @@ -10,7 +10,6 @@ #include -//#include "ProtocolIE_SingleContainerE2.h" /* Including external dependencies */ #include @@ -25,7 +24,7 @@ struct ProtocolIE_SingleContainerE2; /* RANfunctions-List */ typedef struct RANfunctions_List { - A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P3_t) list; + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/codec_utils/E2AP/RANfunctionsID-List.c b/src/codec_utils/E2AP/RANfunctionsID-List.c index 5d3f1262d..4d00473df 100644 --- a/src/codec_utils/E2AP/RANfunctionsID-List.c +++ b/src/codec_utils/E2AP/RANfunctionsID-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionsID-List.h" @@ -20,7 +20,7 @@ static asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P4, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P4, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RANfunctionsID-List.h b/src/codec_utils/E2AP/RANfunctionsID-List.h index 381c4f424..4dd033d39 100644 --- a/src/codec_utils/E2AP/RANfunctionsID-List.h +++ b/src/codec_utils/E2AP/RANfunctionsID-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionsID_List_H_ @@ -24,7 +24,7 @@ struct ProtocolIE_SingleContainerE2; /* RANfunctionsID-List */ typedef struct RANfunctionsID_List { - A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P4_t) list; + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/codec_utils/E2AP/RANfunctionsIDcause-List.c b/src/codec_utils/E2AP/RANfunctionsIDcause-List.c index a0bf56eb7..71e797c9f 100644 --- a/src/codec_utils/E2AP/RANfunctionsIDcause-List.c +++ b/src/codec_utils/E2AP/RANfunctionsIDcause-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RANfunctionsIDcause-List.h" @@ -20,7 +20,7 @@ static asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P5, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P5, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RANfunctionsIDcause-List.h b/src/codec_utils/E2AP/RANfunctionsIDcause-List.h index 02de48210..7f9272890 100644 --- a/src/codec_utils/E2AP/RANfunctionsIDcause-List.h +++ b/src/codec_utils/E2AP/RANfunctionsIDcause-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RANfunctionsIDcause_List_H_ @@ -24,7 +24,7 @@ struct ProtocolIE_SingleContainerE2; /* RANfunctionsIDcause-List */ typedef struct RANfunctionsIDcause_List { - A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P5_t) list; + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/codec_utils/E2AP/RICaction-Admitted-Item.c b/src/codec_utils/E2AP/RICaction-Admitted-Item.c index 7d22606f6..bde36ce46 100644 --- a/src/codec_utils/E2AP/RICaction-Admitted-Item.c +++ b/src/codec_utils/E2AP/RICaction-Admitted-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICaction-Admitted-Item.h" diff --git a/src/codec_utils/E2AP/RICaction-Admitted-Item.h b/src/codec_utils/E2AP/RICaction-Admitted-Item.h index ce84e2983..bf65157b3 100644 --- a/src/codec_utils/E2AP/RICaction-Admitted-Item.h +++ b/src/codec_utils/E2AP/RICaction-Admitted-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICaction_Admitted_Item_H_ diff --git a/src/codec_utils/E2AP/RICaction-Admitted-List.c b/src/codec_utils/E2AP/RICaction-Admitted-List.c index 4b47c173f..e22291941 100644 --- a/src/codec_utils/E2AP/RICaction-Admitted-List.c +++ b/src/codec_utils/E2AP/RICaction-Admitted-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICaction-Admitted-List.h" @@ -20,7 +20,7 @@ static asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P1, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P1, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICaction-Admitted-List.h b/src/codec_utils/E2AP/RICaction-Admitted-List.h index 858d6abf5..6df6ff0cd 100644 --- a/src/codec_utils/E2AP/RICaction-Admitted-List.h +++ b/src/codec_utils/E2AP/RICaction-Admitted-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICaction_Admitted_List_H_ @@ -24,7 +24,7 @@ struct ProtocolIE_SingleContainerE2; /* RICaction-Admitted-List */ typedef struct RICaction_Admitted_List { - A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P1_t) list; + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.c b/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.c index 376f43d78..fe65ec5d2 100644 --- a/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.c +++ b/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICaction-NotAdmitted-Item.h" diff --git a/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.h b/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.h index 7c43e7f8e..33230937a 100644 --- a/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.h +++ b/src/codec_utils/E2AP/RICaction-NotAdmitted-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICaction_NotAdmitted_Item_H_ diff --git a/src/codec_utils/E2AP/RICaction-NotAdmitted-List.c b/src/codec_utils/E2AP/RICaction-NotAdmitted-List.c index c5f3ba4b3..aa4b3989c 100644 --- a/src/codec_utils/E2AP/RICaction-NotAdmitted-List.c +++ b/src/codec_utils/E2AP/RICaction-NotAdmitted-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICaction-NotAdmitted-List.h" @@ -20,7 +20,7 @@ static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P2, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P2, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICaction-NotAdmitted-List.h b/src/codec_utils/E2AP/RICaction-NotAdmitted-List.h index 3b146f644..5cbe6f6cc 100644 --- a/src/codec_utils/E2AP/RICaction-NotAdmitted-List.h +++ b/src/codec_utils/E2AP/RICaction-NotAdmitted-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICaction_NotAdmitted_List_H_ diff --git a/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.c b/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.c index cecdcd423..d8e295eac 100644 --- a/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.c +++ b/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICaction-ToBeSetup-Item.h" diff --git a/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.h b/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.h index 5003dcf72..be48441b4 100644 --- a/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.h +++ b/src/codec_utils/E2AP/RICaction-ToBeSetup-Item.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICaction_ToBeSetup_Item_H_ diff --git a/src/codec_utils/E2AP/RICactionDefinition.c b/src/codec_utils/E2AP/RICactionDefinition.c index c8600b3c3..584e5b751 100644 --- a/src/codec_utils/E2AP/RICactionDefinition.c +++ b/src/codec_utils/E2AP/RICactionDefinition.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICactionDefinition.h" diff --git a/src/codec_utils/E2AP/RICactionDefinition.h b/src/codec_utils/E2AP/RICactionDefinition.h index 9822a347b..84844e2d1 100644 --- a/src/codec_utils/E2AP/RICactionDefinition.h +++ b/src/codec_utils/E2AP/RICactionDefinition.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICactionDefinition_H_ diff --git a/src/codec_utils/E2AP/RICactionID.c b/src/codec_utils/E2AP/RICactionID.c index 25b71fefa..a58376c1f 100644 --- a/src/codec_utils/E2AP/RICactionID.c +++ b/src/codec_utils/E2AP/RICactionID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICactionID.h" diff --git a/src/codec_utils/E2AP/RICactionID.h b/src/codec_utils/E2AP/RICactionID.h index b058d8e39..a7adf7853 100644 --- a/src/codec_utils/E2AP/RICactionID.h +++ b/src/codec_utils/E2AP/RICactionID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICactionID_H_ diff --git a/src/codec_utils/E2AP/RICactionType.c b/src/codec_utils/E2AP/RICactionType.c index f4cb0cf43..1f8feb4b9 100644 --- a/src/codec_utils/E2AP/RICactionType.c +++ b/src/codec_utils/E2AP/RICactionType.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICactionType.h" diff --git a/src/codec_utils/E2AP/RICactionType.h b/src/codec_utils/E2AP/RICactionType.h index 89f402fa1..706b15dc4 100644 --- a/src/codec_utils/E2AP/RICactionType.h +++ b/src/codec_utils/E2AP/RICactionType.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICactionType_H_ diff --git a/src/codec_utils/E2AP/RICactions-ToBeSetup-List.c b/src/codec_utils/E2AP/RICactions-ToBeSetup-List.c index 2439ca781..fd0ccfb99 100644 --- a/src/codec_utils/E2AP/RICactions-ToBeSetup-List.c +++ b/src/codec_utils/E2AP/RICactions-ToBeSetup-List.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICactions-ToBeSetup-List.h" @@ -20,7 +20,7 @@ asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = { { ATF_POINTER, 0, 0, (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, - &asn_DEF_ProtocolIE_SingleContainerE2_1410P0, + &asn_DEF_ProtocolIE_SingleContainerE2_1408P0, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICactions-ToBeSetup-List.h b/src/codec_utils/E2AP/RICactions-ToBeSetup-List.h index 6ece2f122..bec06900f 100644 --- a/src/codec_utils/E2AP/RICactions-ToBeSetup-List.h +++ b/src/codec_utils/E2AP/RICactions-ToBeSetup-List.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICactions_ToBeSetup_List_H_ @@ -24,7 +24,7 @@ struct ProtocolIE_SingleContainerE2; /* RICactions-ToBeSetup-List */ typedef struct RICactions_ToBeSetup_List { - A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P0_t) list; + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/src/codec_utils/E2AP/RICcallProcessID.c b/src/codec_utils/E2AP/RICcallProcessID.c index b1caab37d..a27662fa1 100644 --- a/src/codec_utils/E2AP/RICcallProcessID.c +++ b/src/codec_utils/E2AP/RICcallProcessID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcallProcessID.h" diff --git a/src/codec_utils/E2AP/RICcallProcessID.h b/src/codec_utils/E2AP/RICcallProcessID.h index 8d06076a5..5a3da4613 100644 --- a/src/codec_utils/E2AP/RICcallProcessID.h +++ b/src/codec_utils/E2AP/RICcallProcessID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcallProcessID_H_ diff --git a/src/codec_utils/E2AP/RICcontrolAckRequest.c b/src/codec_utils/E2AP/RICcontrolAckRequest.c index 8ef27b7c9..5231de90f 100644 --- a/src/codec_utils/E2AP/RICcontrolAckRequest.c +++ b/src/codec_utils/E2AP/RICcontrolAckRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolAckRequest.h" diff --git a/src/codec_utils/E2AP/RICcontrolAckRequest.h b/src/codec_utils/E2AP/RICcontrolAckRequest.h index 73ef88a0b..42ad985a5 100644 --- a/src/codec_utils/E2AP/RICcontrolAckRequest.h +++ b/src/codec_utils/E2AP/RICcontrolAckRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolAckRequest_H_ diff --git a/src/codec_utils/E2AP/RICcontrolAcknowledge.c b/src/codec_utils/E2AP/RICcontrolAcknowledge.c index a4cb659cb..bfd6eb4e9 100644 --- a/src/codec_utils/E2AP/RICcontrolAcknowledge.c +++ b/src/codec_utils/E2AP/RICcontrolAcknowledge.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolAcknowledge.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P8, + &asn_DEF_ProtocolIE_ContainerE2_1405P8, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICcontrolAcknowledge.h b/src/codec_utils/E2AP/RICcontrolAcknowledge.h index a288d3563..3d081a64b 100644 --- a/src/codec_utils/E2AP/RICcontrolAcknowledge.h +++ b/src/codec_utils/E2AP/RICcontrolAcknowledge.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolAcknowledge_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolAcknowledge */ typedef struct RICcontrolAcknowledge { - ProtocolIE_ContainerE2_1407P8_t protocolIEs; + ProtocolIE_ContainerE2_1405P8_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICcontrolFailure.c b/src/codec_utils/E2AP/RICcontrolFailure.c index ee6affe82..9b63b8153 100644 --- a/src/codec_utils/E2AP/RICcontrolFailure.c +++ b/src/codec_utils/E2AP/RICcontrolFailure.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolFailure.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P9, + &asn_DEF_ProtocolIE_ContainerE2_1405P9, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICcontrolFailure.h b/src/codec_utils/E2AP/RICcontrolFailure.h index 5659bb6c5..805aaefac 100644 --- a/src/codec_utils/E2AP/RICcontrolFailure.h +++ b/src/codec_utils/E2AP/RICcontrolFailure.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolFailure_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolFailure */ typedef struct RICcontrolFailure { - ProtocolIE_ContainerE2_1407P9_t protocolIEs; + ProtocolIE_ContainerE2_1405P9_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICcontrolHeader.c b/src/codec_utils/E2AP/RICcontrolHeader.c index 01449fe2e..f5978183f 100644 --- a/src/codec_utils/E2AP/RICcontrolHeader.c +++ b/src/codec_utils/E2AP/RICcontrolHeader.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolHeader.h" diff --git a/src/codec_utils/E2AP/RICcontrolHeader.h b/src/codec_utils/E2AP/RICcontrolHeader.h index f73fd59ef..c384851c2 100644 --- a/src/codec_utils/E2AP/RICcontrolHeader.h +++ b/src/codec_utils/E2AP/RICcontrolHeader.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolHeader_H_ diff --git a/src/codec_utils/E2AP/RICcontrolMessage.c b/src/codec_utils/E2AP/RICcontrolMessage.c index f073a04bb..7bf85a3dc 100644 --- a/src/codec_utils/E2AP/RICcontrolMessage.c +++ b/src/codec_utils/E2AP/RICcontrolMessage.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolMessage.h" diff --git a/src/codec_utils/E2AP/RICcontrolMessage.h b/src/codec_utils/E2AP/RICcontrolMessage.h index 05d608e8b..d8d081188 100644 --- a/src/codec_utils/E2AP/RICcontrolMessage.h +++ b/src/codec_utils/E2AP/RICcontrolMessage.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolMessage_H_ diff --git a/src/codec_utils/E2AP/RICcontrolOutcome.c b/src/codec_utils/E2AP/RICcontrolOutcome.c index 388a53500..4b8f96c6e 100644 --- a/src/codec_utils/E2AP/RICcontrolOutcome.c +++ b/src/codec_utils/E2AP/RICcontrolOutcome.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolOutcome.h" diff --git a/src/codec_utils/E2AP/RICcontrolOutcome.h b/src/codec_utils/E2AP/RICcontrolOutcome.h index 92396ceb0..f710f90ba 100644 --- a/src/codec_utils/E2AP/RICcontrolOutcome.h +++ b/src/codec_utils/E2AP/RICcontrolOutcome.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolOutcome_H_ diff --git a/src/codec_utils/E2AP/RICcontrolRequest.c b/src/codec_utils/E2AP/RICcontrolRequest.c index f326e050d..60f0603a3 100644 --- a/src/codec_utils/E2AP/RICcontrolRequest.c +++ b/src/codec_utils/E2AP/RICcontrolRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolRequest.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P7, + &asn_DEF_ProtocolIE_ContainerE2_1405P7, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICcontrolRequest.h b/src/codec_utils/E2AP/RICcontrolRequest.h index 9f35b5d9e..962650edf 100644 --- a/src/codec_utils/E2AP/RICcontrolRequest.h +++ b/src/codec_utils/E2AP/RICcontrolRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolRequest_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICcontrolRequest */ typedef struct RICcontrolRequest { - ProtocolIE_ContainerE2_1407P7_t protocolIEs; + ProtocolIE_ContainerE2_1405P7_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICcontrolStatus.c b/src/codec_utils/E2AP/RICcontrolStatus.c index 73e3356c6..cc9b04c33 100644 --- a/src/codec_utils/E2AP/RICcontrolStatus.c +++ b/src/codec_utils/E2AP/RICcontrolStatus.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICcontrolStatus.h" diff --git a/src/codec_utils/E2AP/RICcontrolStatus.h b/src/codec_utils/E2AP/RICcontrolStatus.h index 95711c697..d1e70ac8c 100644 --- a/src/codec_utils/E2AP/RICcontrolStatus.h +++ b/src/codec_utils/E2AP/RICcontrolStatus.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICcontrolStatus_H_ diff --git a/src/codec_utils/E2AP/RICeventTriggerDefinition.c b/src/codec_utils/E2AP/RICeventTriggerDefinition.c index f4eb284cf..c4e74561d 100644 --- a/src/codec_utils/E2AP/RICeventTriggerDefinition.c +++ b/src/codec_utils/E2AP/RICeventTriggerDefinition.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICeventTriggerDefinition.h" diff --git a/src/codec_utils/E2AP/RICeventTriggerDefinition.h b/src/codec_utils/E2AP/RICeventTriggerDefinition.h index 635908cc8..5a9d4ed39 100644 --- a/src/codec_utils/E2AP/RICeventTriggerDefinition.h +++ b/src/codec_utils/E2AP/RICeventTriggerDefinition.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICeventTriggerDefinition_H_ diff --git a/src/codec_utils/E2AP/RICindication.c b/src/codec_utils/E2AP/RICindication.c index 10376a879..4875933ea 100644 --- a/src/codec_utils/E2AP/RICindication.c +++ b/src/codec_utils/E2AP/RICindication.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICindication.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICindication_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICindication, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P6, + &asn_DEF_ProtocolIE_ContainerE2_1405P6, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICindication.h b/src/codec_utils/E2AP/RICindication.h index d4d170a71..d8b9b19a0 100644 --- a/src/codec_utils/E2AP/RICindication.h +++ b/src/codec_utils/E2AP/RICindication.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICindication_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICindication */ typedef struct RICindication { - ProtocolIE_ContainerE2_1407P6_t protocolIEs; + ProtocolIE_ContainerE2_1405P6_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICindicationHeader.c b/src/codec_utils/E2AP/RICindicationHeader.c index feed94e7a..01aabf2d4 100644 --- a/src/codec_utils/E2AP/RICindicationHeader.c +++ b/src/codec_utils/E2AP/RICindicationHeader.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICindicationHeader.h" diff --git a/src/codec_utils/E2AP/RICindicationHeader.h b/src/codec_utils/E2AP/RICindicationHeader.h index 1164809fc..e201f933d 100644 --- a/src/codec_utils/E2AP/RICindicationHeader.h +++ b/src/codec_utils/E2AP/RICindicationHeader.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICindicationHeader_H_ diff --git a/src/codec_utils/E2AP/RICindicationMessage.c b/src/codec_utils/E2AP/RICindicationMessage.c index e9c74dc3b..d66e3db1a 100644 --- a/src/codec_utils/E2AP/RICindicationMessage.c +++ b/src/codec_utils/E2AP/RICindicationMessage.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICindicationMessage.h" diff --git a/src/codec_utils/E2AP/RICindicationMessage.h b/src/codec_utils/E2AP/RICindicationMessage.h index 82e7608b3..be659ab1c 100644 --- a/src/codec_utils/E2AP/RICindicationMessage.h +++ b/src/codec_utils/E2AP/RICindicationMessage.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICindicationMessage_H_ diff --git a/src/codec_utils/E2AP/RICindicationSN.c b/src/codec_utils/E2AP/RICindicationSN.c index 8afca171e..69a3014ce 100644 --- a/src/codec_utils/E2AP/RICindicationSN.c +++ b/src/codec_utils/E2AP/RICindicationSN.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICindicationSN.h" diff --git a/src/codec_utils/E2AP/RICindicationSN.h b/src/codec_utils/E2AP/RICindicationSN.h index 1c7167293..5a6b73687 100644 --- a/src/codec_utils/E2AP/RICindicationSN.h +++ b/src/codec_utils/E2AP/RICindicationSN.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICindicationSN_H_ diff --git a/src/codec_utils/E2AP/RICindicationType.c b/src/codec_utils/E2AP/RICindicationType.c index a00907e95..cffc96d7b 100644 --- a/src/codec_utils/E2AP/RICindicationType.c +++ b/src/codec_utils/E2AP/RICindicationType.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICindicationType.h" diff --git a/src/codec_utils/E2AP/RICindicationType.h b/src/codec_utils/E2AP/RICindicationType.h index 23614b934..5e33ba572 100644 --- a/src/codec_utils/E2AP/RICindicationType.h +++ b/src/codec_utils/E2AP/RICindicationType.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICindicationType_H_ diff --git a/src/codec_utils/E2AP/RICrequestID.c b/src/codec_utils/E2AP/RICrequestID.c index 2e34c8da4..8f8ee3ef2 100644 --- a/src/codec_utils/E2AP/RICrequestID.c +++ b/src/codec_utils/E2AP/RICrequestID.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICrequestID.h" diff --git a/src/codec_utils/E2AP/RICrequestID.h b/src/codec_utils/E2AP/RICrequestID.h index 2114a7c9a..810e889f9 100644 --- a/src/codec_utils/E2AP/RICrequestID.h +++ b/src/codec_utils/E2AP/RICrequestID.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICrequestID_H_ diff --git a/src/codec_utils/E2AP/RICserviceQuery.c b/src/codec_utils/E2AP/RICserviceQuery.c index 6cdf79711..1949b5cdd 100644 --- a/src/codec_utils/E2AP/RICserviceQuery.c +++ b/src/codec_utils/E2AP/RICserviceQuery.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICserviceQuery.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P19, + &asn_DEF_ProtocolIE_ContainerE2_1405P19, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICserviceQuery.h b/src/codec_utils/E2AP/RICserviceQuery.h index 454412976..59a2b2698 100644 --- a/src/codec_utils/E2AP/RICserviceQuery.h +++ b/src/codec_utils/E2AP/RICserviceQuery.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICserviceQuery_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICserviceQuery */ typedef struct RICserviceQuery { - ProtocolIE_ContainerE2_1407P19_t protocolIEs; + ProtocolIE_ContainerE2_1405P19_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICserviceUpdate.c b/src/codec_utils/E2AP/RICserviceUpdate.c index 34224756c..7860e59d2 100644 --- a/src/codec_utils/E2AP/RICserviceUpdate.c +++ b/src/codec_utils/E2AP/RICserviceUpdate.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICserviceUpdate.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P16, + &asn_DEF_ProtocolIE_ContainerE2_1405P16, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICserviceUpdate.h b/src/codec_utils/E2AP/RICserviceUpdate.h index a817b3d25..6c95e6d7b 100644 --- a/src/codec_utils/E2AP/RICserviceUpdate.h +++ b/src/codec_utils/E2AP/RICserviceUpdate.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICserviceUpdate_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdate */ typedef struct RICserviceUpdate { - ProtocolIE_ContainerE2_1407P16_t protocolIEs; + ProtocolIE_ContainerE2_1405P16_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.c b/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.c index debb9463f..5d55cf5ed 100644 --- a/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.c +++ b/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICserviceUpdateAcknowledge.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P17, + &asn_DEF_ProtocolIE_ContainerE2_1405P17, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.h b/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.h index b6927a00f..388cef1b2 100644 --- a/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.h +++ b/src/codec_utils/E2AP/RICserviceUpdateAcknowledge.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICserviceUpdateAcknowledge_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdateAcknowledge */ typedef struct RICserviceUpdateAcknowledge { - ProtocolIE_ContainerE2_1407P17_t protocolIEs; + ProtocolIE_ContainerE2_1405P17_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICserviceUpdateFailure.c b/src/codec_utils/E2AP/RICserviceUpdateFailure.c index cef1a5ef3..43174772f 100644 --- a/src/codec_utils/E2AP/RICserviceUpdateFailure.c +++ b/src/codec_utils/E2AP/RICserviceUpdateFailure.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICserviceUpdateFailure.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P18, + &asn_DEF_ProtocolIE_ContainerE2_1405P18, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICserviceUpdateFailure.h b/src/codec_utils/E2AP/RICserviceUpdateFailure.h index 9b636392f..8c8da05d3 100644 --- a/src/codec_utils/E2AP/RICserviceUpdateFailure.h +++ b/src/codec_utils/E2AP/RICserviceUpdateFailure.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICserviceUpdateFailure_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICserviceUpdateFailure */ typedef struct RICserviceUpdateFailure { - ProtocolIE_ContainerE2_1407P18_t protocolIEs; + ProtocolIE_ContainerE2_1405P18_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.c b/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.c index 41752ec2b..025f8c52c 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.c +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionDeleteFailure.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P5, + &asn_DEF_ProtocolIE_ContainerE2_1405P5, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.h b/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.h index 407f66d77..86bffb600 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.h +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteFailure.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionDeleteFailure_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteFailure */ typedef struct RICsubscriptionDeleteFailure { - ProtocolIE_ContainerE2_1407P5_t protocolIEs; + ProtocolIE_ContainerE2_1405P5_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.c b/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.c index baf2f2770..f1072be7b 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.c +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionDeleteRequest.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P3, + &asn_DEF_ProtocolIE_ContainerE2_1405P3, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.h b/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.h index ec2aaf0a1..9434489c4 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.h +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionDeleteRequest_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteRequest */ typedef struct RICsubscriptionDeleteRequest { - ProtocolIE_ContainerE2_1407P3_t protocolIEs; + ProtocolIE_ContainerE2_1405P3_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.c b/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.c index 187e8baeb..545f75955 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.c +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionDeleteResponse.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P4, + &asn_DEF_ProtocolIE_ContainerE2_1405P4, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.h b/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.h index a601a4332..45a16fba8 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.h +++ b/src/codec_utils/E2AP/RICsubscriptionDeleteResponse.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionDeleteResponse_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionDeleteResponse */ typedef struct RICsubscriptionDeleteResponse { - ProtocolIE_ContainerE2_1407P4_t protocolIEs; + ProtocolIE_ContainerE2_1405P4_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionDetails.c b/src/codec_utils/E2AP/RICsubscriptionDetails.c index 064be1ad0..72015b88c 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDetails.c +++ b/src/codec_utils/E2AP/RICsubscriptionDetails.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionDetails.h" diff --git a/src/codec_utils/E2AP/RICsubscriptionDetails.h b/src/codec_utils/E2AP/RICsubscriptionDetails.h index e25d8662c..023d42908 100644 --- a/src/codec_utils/E2AP/RICsubscriptionDetails.h +++ b/src/codec_utils/E2AP/RICsubscriptionDetails.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionDetails_H_ diff --git a/src/codec_utils/E2AP/RICsubscriptionFailure.c b/src/codec_utils/E2AP/RICsubscriptionFailure.c index 141a5a1f7..991d2818d 100644 --- a/src/codec_utils/E2AP/RICsubscriptionFailure.c +++ b/src/codec_utils/E2AP/RICsubscriptionFailure.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionFailure.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P2, + &asn_DEF_ProtocolIE_ContainerE2_1405P2, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionFailure.h b/src/codec_utils/E2AP/RICsubscriptionFailure.h index a0ba284bd..e435c3d3b 100644 --- a/src/codec_utils/E2AP/RICsubscriptionFailure.h +++ b/src/codec_utils/E2AP/RICsubscriptionFailure.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionFailure_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionFailure */ typedef struct RICsubscriptionFailure { - ProtocolIE_ContainerE2_1407P2_t protocolIEs; + ProtocolIE_ContainerE2_1405P2_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionRequest.c b/src/codec_utils/E2AP/RICsubscriptionRequest.c index 5a9a020ad..ec3f4b2d5 100644 --- a/src/codec_utils/E2AP/RICsubscriptionRequest.c +++ b/src/codec_utils/E2AP/RICsubscriptionRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionRequest.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P0, + &asn_DEF_ProtocolIE_ContainerE2_1405P0, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionRequest.h b/src/codec_utils/E2AP/RICsubscriptionRequest.h index c92e05ed9..b74bf9d72 100644 --- a/src/codec_utils/E2AP/RICsubscriptionRequest.h +++ b/src/codec_utils/E2AP/RICsubscriptionRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionRequest_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionRequest */ typedef struct RICsubscriptionRequest { - ProtocolIE_ContainerE2_1407P0_t protocolIEs; + ProtocolIE_ContainerE2_1405P0_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubscriptionResponse.c b/src/codec_utils/E2AP/RICsubscriptionResponse.c index 0ac75b23e..b0df96f82 100644 --- a/src/codec_utils/E2AP/RICsubscriptionResponse.c +++ b/src/codec_utils/E2AP/RICsubscriptionResponse.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubscriptionResponse.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = { { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P1, + &asn_DEF_ProtocolIE_ContainerE2_1405P1, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/RICsubscriptionResponse.h b/src/codec_utils/E2AP/RICsubscriptionResponse.h index 0fbcff36f..8b73d1e30 100644 --- a/src/codec_utils/E2AP/RICsubscriptionResponse.h +++ b/src/codec_utils/E2AP/RICsubscriptionResponse.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubscriptionResponse_H_ @@ -21,7 +21,7 @@ extern "C" { /* RICsubscriptionResponse */ typedef struct RICsubscriptionResponse { - ProtocolIE_ContainerE2_1407P1_t protocolIEs; + ProtocolIE_ContainerE2_1405P1_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/RICsubsequentAction.c b/src/codec_utils/E2AP/RICsubsequentAction.c index e6f899506..70624314c 100644 --- a/src/codec_utils/E2AP/RICsubsequentAction.c +++ b/src/codec_utils/E2AP/RICsubsequentAction.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubsequentAction.h" diff --git a/src/codec_utils/E2AP/RICsubsequentAction.h b/src/codec_utils/E2AP/RICsubsequentAction.h index 1496df33f..37344ecf1 100644 --- a/src/codec_utils/E2AP/RICsubsequentAction.h +++ b/src/codec_utils/E2AP/RICsubsequentAction.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubsequentAction_H_ diff --git a/src/codec_utils/E2AP/RICsubsequentActionType.c b/src/codec_utils/E2AP/RICsubsequentActionType.c index 050b1b55d..3a5552c09 100644 --- a/src/codec_utils/E2AP/RICsubsequentActionType.c +++ b/src/codec_utils/E2AP/RICsubsequentActionType.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICsubsequentActionType.h" diff --git a/src/codec_utils/E2AP/RICsubsequentActionType.h b/src/codec_utils/E2AP/RICsubsequentActionType.h index c41df0acc..cab5ccf16 100644 --- a/src/codec_utils/E2AP/RICsubsequentActionType.h +++ b/src/codec_utils/E2AP/RICsubsequentActionType.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICsubsequentActionType_H_ diff --git a/src/codec_utils/E2AP/RICtimeToWait.c b/src/codec_utils/E2AP/RICtimeToWait.c index 488974f8b..3a09642ab 100644 --- a/src/codec_utils/E2AP/RICtimeToWait.c +++ b/src/codec_utils/E2AP/RICtimeToWait.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "RICtimeToWait.h" diff --git a/src/codec_utils/E2AP/RICtimeToWait.h b/src/codec_utils/E2AP/RICtimeToWait.h index a4d0a71ef..ada7a9481 100644 --- a/src/codec_utils/E2AP/RICtimeToWait.h +++ b/src/codec_utils/E2AP/RICtimeToWait.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _RICtimeToWait_H_ diff --git a/src/codec_utils/E2AP/ResetRequest.c b/src/codec_utils/E2AP/ResetRequest.c index 2793af7f4..a2c7cfc98 100644 --- a/src/codec_utils/E2AP/ResetRequest.c +++ b/src/codec_utils/E2AP/ResetRequest.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ResetRequest.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_ResetRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ResetRequest, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P14, + &asn_DEF_ProtocolIE_ContainerE2_1405P14, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/ResetRequest.h b/src/codec_utils/E2AP/ResetRequest.h index bc7f37093..3a1f22caa 100644 --- a/src/codec_utils/E2AP/ResetRequest.h +++ b/src/codec_utils/E2AP/ResetRequest.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ResetRequest_H_ @@ -21,7 +21,7 @@ extern "C" { /* ResetRequest */ typedef struct ResetRequest { - ProtocolIE_ContainerE2_1407P14_t protocolIEs; + ProtocolIE_ContainerE2_1405P14_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/ResetResponse.c b/src/codec_utils/E2AP/ResetResponse.c index e92274917..ad11a2159 100644 --- a/src/codec_utils/E2AP/ResetResponse.c +++ b/src/codec_utils/E2AP/ResetResponse.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "ResetResponse.h" @@ -11,7 +11,7 @@ asn_TYPE_member_t asn_MBR_ResetResponse_1[] = { { ATF_NOFLAGS, 0, offsetof(struct ResetResponse, protocolIEs), (ASN_TAG_CLASS_CONTEXT | (0 << 2)), -1, /* IMPLICIT tag at current level */ - &asn_DEF_ProtocolIE_ContainerE2_1407P15, + &asn_DEF_ProtocolIE_ContainerE2_1405P15, 0, { 0, 0, 0 }, 0, 0, /* No default value */ diff --git a/src/codec_utils/E2AP/ResetResponse.h b/src/codec_utils/E2AP/ResetResponse.h index 668029db0..6bef89eb5 100644 --- a/src/codec_utils/E2AP/ResetResponse.h +++ b/src/codec_utils/E2AP/ResetResponse.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Contents" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _ResetResponse_H_ @@ -21,7 +21,7 @@ extern "C" { /* ResetResponse */ typedef struct ResetResponse { - ProtocolIE_ContainerE2_1407P15_t protocolIEs; + ProtocolIE_ContainerE2_1405P15_t protocolIEs; /* * This type is extensible, * possible extensions are below. diff --git a/src/codec_utils/E2AP/SuccessfulOutcomeE2.c b/src/codec_utils/E2AP/SuccessfulOutcomeE2.c index af0051874..102e3ffdf 100644 --- a/src/codec_utils/E2AP/SuccessfulOutcomeE2.c +++ b/src/codec_utils/E2AP/SuccessfulOutcomeE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "SuccessfulOutcomeE2.h" diff --git a/src/codec_utils/E2AP/SuccessfulOutcomeE2.h b/src/codec_utils/E2AP/SuccessfulOutcomeE2.h index 4c408523c..125877f5b 100644 --- a/src/codec_utils/E2AP/SuccessfulOutcomeE2.h +++ b/src/codec_utils/E2AP/SuccessfulOutcomeE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _SuccessfulOutcomeE2_H_ diff --git a/src/codec_utils/E2AP/TimeToWaitE2.c b/src/codec_utils/E2AP/TimeToWaitE2.c index 2bccde668..3f4fe431e 100644 --- a/src/codec_utils/E2AP/TimeToWaitE2.c +++ b/src/codec_utils/E2AP/TimeToWaitE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "TimeToWaitE2.h" diff --git a/src/codec_utils/E2AP/TimeToWaitE2.h b/src/codec_utils/E2AP/TimeToWaitE2.h index 94fd8ed91..45cc0b993 100644 --- a/src/codec_utils/E2AP/TimeToWaitE2.h +++ b/src/codec_utils/E2AP/TimeToWaitE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _TimeToWaitE2_H_ diff --git a/src/codec_utils/E2AP/TriggeringMessageE2.c b/src/codec_utils/E2AP/TriggeringMessageE2.c index 38485887e..1e85a13f6 100644 --- a/src/codec_utils/E2AP/TriggeringMessageE2.c +++ b/src/codec_utils/E2AP/TriggeringMessageE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "TriggeringMessageE2.h" diff --git a/src/codec_utils/E2AP/TriggeringMessageE2.h b/src/codec_utils/E2AP/TriggeringMessageE2.h index f480dee65..66d0f018e 100644 --- a/src/codec_utils/E2AP/TriggeringMessageE2.h +++ b/src/codec_utils/E2AP/TriggeringMessageE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-CommonDataTypes" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _TriggeringMessageE2_H_ diff --git a/src/codec_utils/E2AP/TypeOfErrorE2.c b/src/codec_utils/E2AP/TypeOfErrorE2.c index d1d30e909..fcc9e87a8 100644 --- a/src/codec_utils/E2AP/TypeOfErrorE2.c +++ b/src/codec_utils/E2AP/TypeOfErrorE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "TypeOfErrorE2.h" diff --git a/src/codec_utils/E2AP/TypeOfErrorE2.h b/src/codec_utils/E2AP/TypeOfErrorE2.h index 57508d5ea..79ec156ff 100644 --- a/src/codec_utils/E2AP/TypeOfErrorE2.h +++ b/src/codec_utils/E2AP/TypeOfErrorE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-IEs" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _TypeOfErrorE2_H_ diff --git a/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.c b/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.c index a394f12c1..801b819be 100644 --- a/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.c +++ b/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.c @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #include "UnsuccessfulOutcomeE2.h" diff --git a/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.h b/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.h index b437ded74..608650c89 100644 --- a/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.h +++ b/src/codec_utils/E2AP/UnsuccessfulOutcomeE2.h @@ -1,8 +1,8 @@ /* * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) * From ASN.1 module "E2AP-PDU-Descriptions" - * found in "E2AP.asn1" - * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + * found in "codeathon/E2AP.asn1" + * `asn1c -D ./newE2AP -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` */ #ifndef _UnsuccessfulOutcomeE2_H_ diff --git a/src/codec_utils/E2AP/e2ap b/src/codec_utils/E2AP/e2ap old mode 100644 new mode 100755 index 97c6a6f2d5d87de425b8ba18109f6830bd41fe00..3a94a61b43b9f36efbe8473733cb18c2ae425ce7 GIT binary patch delta 33236 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 Rea)%g8G8XAs?XT1{~xp=tFiz9 diff --git a/src/codec_utils/E2AP_MASTER/CauseE2.c b/src/codec_utils/E2AP_MASTER/CauseE2.c new file mode 100644 index 000000000..4d39d1f26 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseE2.c @@ -0,0 +1,95 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseE2.h" + +static asn_oer_constraints_t asn_OER_type_CauseE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 4 } /* (0..4,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_CauseE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.ricRequest), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseRIC, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.ricService), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseRICservice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricService" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.transport), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseTransport, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "transport" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.protocol), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseProtocol, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocol" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.misc), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseMisc, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "misc" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_CauseE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* misc */ +}; +asn_CHOICE_specifics_t asn_SPC_CauseE2_specs_1 = { + sizeof(struct CauseE2), + offsetof(struct CauseE2, _asn_ctx), + offsetof(struct CauseE2, present), + sizeof(((struct CauseE2 *)0)->present), + asn_MAP_CauseE2_tag2el_1, + 5, /* Count of tags in the map */ + 0, 0, + 5 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_CauseE2 = { + "CauseE2", + "CauseE2", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_CauseE2_constr_1, &asn_PER_type_CauseE2_constr_1, CHOICE_constraint }, + asn_MBR_CauseE2_1, + 5, /* Elements count */ + &asn_SPC_CauseE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseE2.h b/src/codec_utils/E2AP_MASTER/CauseE2.h new file mode 100644 index 000000000..1298a7f97 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseE2.h @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseE2_H_ +#define _CauseE2_H_ + + +#include + +/* Including external dependencies */ +#include "CauseRIC.h" +#include "CauseRICservice.h" +#include "CauseTransport.h" +#include "CauseProtocol.h" +#include "CauseMisc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseE2_PR { + CauseE2_PR_NOTHING, /* No components present */ + CauseE2_PR_ricRequest, + CauseE2_PR_ricService, + CauseE2_PR_transport, + CauseE2_PR_protocol, + CauseE2_PR_misc + /* Extensions may appear below */ + +} CauseE2_PR; + +/* CauseE2 */ +typedef struct CauseE2 { + CauseE2_PR present; + union CauseE2_u { + CauseRIC_t ricRequest; + CauseRICservice_t ricService; + CauseTransport_t transport; + CauseProtocol_t protocol; + CauseMisc_t misc; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CauseE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CauseE2; +extern asn_CHOICE_specifics_t asn_SPC_CauseE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CauseE2_1[5]; +extern asn_per_constraints_t asn_PER_type_CauseE2_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CauseMisc.c b/src/codec_utils/E2AP_MASTER/CauseMisc.c new file mode 100644 index 000000000..2cc334e5d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseMisc.c @@ -0,0 +1,62 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseMisc.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseMisc_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseMisc_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseMisc_value2enum_1[] = { + { 0, 27, "control-processing-overload" }, + { 1, 16, "hardware-failure" }, + { 2, 15, "om-intervention" }, + { 3, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseMisc_enum2value_1[] = { + 0, /* control-processing-overload(0) */ + 1, /* hardware-failure(1) */ + 2, /* om-intervention(2) */ + 3 /* unspecified(3) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1 = { + asn_MAP_CauseMisc_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseMisc_enum2value_1, /* N => "tag"; sorted by N */ + 4, /* Number of elements in the maps */ + 5, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseMisc_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseMisc = { + "CauseMisc", + "CauseMisc", + &asn_OP_NativeEnumerated, + asn_DEF_CauseMisc_tags_1, + sizeof(asn_DEF_CauseMisc_tags_1) + /sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */ + asn_DEF_CauseMisc_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseMisc_tags_1) + /sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseMisc_constr_1, &asn_PER_type_CauseMisc_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseMisc_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseMisc.h b/src/codec_utils/E2AP_MASTER/CauseMisc.h new file mode 100644 index 000000000..bd8c78463 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseMisc.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseMisc_H_ +#define _CauseMisc_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseMisc { + CauseMisc_control_processing_overload = 0, + CauseMisc_hardware_failure = 1, + CauseMisc_om_intervention = 2, + CauseMisc_unspecified = 3 + /* + * Enumeration is extensible + */ +} e_CauseMisc; + +/* CauseMisc */ +typedef long CauseMisc_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseMisc_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseMisc; +extern const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1; +asn_struct_free_f CauseMisc_free; +asn_struct_print_f CauseMisc_print; +asn_constr_check_f CauseMisc_constraint; +ber_type_decoder_f CauseMisc_decode_ber; +der_type_encoder_f CauseMisc_encode_der; +xer_type_decoder_f CauseMisc_decode_xer; +xer_type_encoder_f CauseMisc_encode_xer; +oer_type_decoder_f CauseMisc_decode_oer; +oer_type_encoder_f CauseMisc_encode_oer; +per_type_decoder_f CauseMisc_decode_uper; +per_type_encoder_f CauseMisc_encode_uper; +per_type_decoder_f CauseMisc_decode_aper; +per_type_encoder_f CauseMisc_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseMisc_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CauseProtocol.c b/src/codec_utils/E2AP_MASTER/CauseProtocol.c new file mode 100644 index 000000000..6f9fa4123 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseProtocol.c @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseProtocol.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseProtocol_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 6 } /* (0..6,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseProtocol_value2enum_1[] = { + { 0, 21, "transfer-syntax-error" }, + { 1, 28, "abstract-syntax-error-reject" }, + { 2, 39, "abstract-syntax-error-ignore-and-notify" }, + { 3, 42, "message-not-compatible-with-receiver-state" }, + { 4, 14, "semantic-error" }, + { 5, 49, "abstract-syntax-error-falsely-constructed-message" }, + { 6, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseProtocol_enum2value_1[] = { + 5, /* abstract-syntax-error-falsely-constructed-message(5) */ + 2, /* abstract-syntax-error-ignore-and-notify(2) */ + 1, /* abstract-syntax-error-reject(1) */ + 3, /* message-not-compatible-with-receiver-state(3) */ + 4, /* semantic-error(4) */ + 0, /* transfer-syntax-error(0) */ + 6 /* unspecified(6) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1 = { + asn_MAP_CauseProtocol_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseProtocol_enum2value_1, /* N => "tag"; sorted by N */ + 7, /* Number of elements in the maps */ + 8, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseProtocol_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseProtocol = { + "CauseProtocol", + "CauseProtocol", + &asn_OP_NativeEnumerated, + asn_DEF_CauseProtocol_tags_1, + sizeof(asn_DEF_CauseProtocol_tags_1) + /sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */ + asn_DEF_CauseProtocol_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseProtocol_tags_1) + /sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseProtocol_constr_1, &asn_PER_type_CauseProtocol_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseProtocol_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseProtocol.h b/src/codec_utils/E2AP_MASTER/CauseProtocol.h new file mode 100644 index 000000000..75083ab9b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseProtocol.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseProtocol_H_ +#define _CauseProtocol_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseProtocol { + CauseProtocol_transfer_syntax_error = 0, + CauseProtocol_abstract_syntax_error_reject = 1, + CauseProtocol_abstract_syntax_error_ignore_and_notify = 2, + CauseProtocol_message_not_compatible_with_receiver_state = 3, + CauseProtocol_semantic_error = 4, + CauseProtocol_abstract_syntax_error_falsely_constructed_message = 5, + CauseProtocol_unspecified = 6 + /* + * Enumeration is extensible + */ +} e_CauseProtocol; + +/* CauseProtocol */ +typedef long CauseProtocol_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseProtocol; +extern const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1; +asn_struct_free_f CauseProtocol_free; +asn_struct_print_f CauseProtocol_print; +asn_constr_check_f CauseProtocol_constraint; +ber_type_decoder_f CauseProtocol_decode_ber; +der_type_encoder_f CauseProtocol_encode_der; +xer_type_decoder_f CauseProtocol_decode_xer; +xer_type_encoder_f CauseProtocol_encode_xer; +oer_type_decoder_f CauseProtocol_decode_oer; +oer_type_encoder_f CauseProtocol_encode_oer; +per_type_decoder_f CauseProtocol_decode_uper; +per_type_encoder_f CauseProtocol_encode_uper; +per_type_decoder_f CauseProtocol_decode_aper; +per_type_encoder_f CauseProtocol_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseProtocol_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CauseRIC.c b/src/codec_utils/E2AP_MASTER/CauseRIC.c new file mode 100644 index 000000000..18e644e92 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseRIC.c @@ -0,0 +1,76 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseRIC.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseRIC_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseRIC_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 10 } /* (0..10,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseRIC_value2enum_1[] = { + { 0, 23, "ran-function-id-Invalid" }, + { 1, 20, "action-not-supported" }, + { 2, 17, "excessive-actions" }, + { 3, 16, "duplicate-action" }, + { 4, 15, "duplicate-event" }, + { 5, 23, "function-resource-limit" }, + { 6, 18, "request-id-unknown" }, + { 7, 46, "inconsistent-action-subsequent-action-sequence" }, + { 8, 23, "control-message-invalid" }, + { 9, 23, "call-process-id-invalid" }, + { 10, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseRIC_enum2value_1[] = { + 1, /* action-not-supported(1) */ + 9, /* call-process-id-invalid(9) */ + 8, /* control-message-invalid(8) */ + 3, /* duplicate-action(3) */ + 4, /* duplicate-event(4) */ + 2, /* excessive-actions(2) */ + 5, /* function-resource-limit(5) */ + 7, /* inconsistent-action-subsequent-action-sequence(7) */ + 0, /* ran-function-id-Invalid(0) */ + 6, /* request-id-unknown(6) */ + 10 /* unspecified(10) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1 = { + asn_MAP_CauseRIC_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseRIC_enum2value_1, /* N => "tag"; sorted by N */ + 11, /* Number of elements in the maps */ + 12, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseRIC_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseRIC = { + "CauseRIC", + "CauseRIC", + &asn_OP_NativeEnumerated, + asn_DEF_CauseRIC_tags_1, + sizeof(asn_DEF_CauseRIC_tags_1) + /sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */ + asn_DEF_CauseRIC_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseRIC_tags_1) + /sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseRIC_constr_1, &asn_PER_type_CauseRIC_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseRIC_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseRIC.h b/src/codec_utils/E2AP_MASTER/CauseRIC.h new file mode 100644 index 000000000..b4925f308 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseRIC.h @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseRIC_H_ +#define _CauseRIC_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseRIC { + CauseRIC_ran_function_id_Invalid = 0, + CauseRIC_action_not_supported = 1, + CauseRIC_excessive_actions = 2, + CauseRIC_duplicate_action = 3, + CauseRIC_duplicate_event = 4, + CauseRIC_function_resource_limit = 5, + CauseRIC_request_id_unknown = 6, + CauseRIC_inconsistent_action_subsequent_action_sequence = 7, + CauseRIC_control_message_invalid = 8, + CauseRIC_call_process_id_invalid = 9, + CauseRIC_unspecified = 10 + /* + * Enumeration is extensible + */ +} e_CauseRIC; + +/* CauseRIC */ +typedef long CauseRIC_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseRIC_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseRIC; +extern const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1; +asn_struct_free_f CauseRIC_free; +asn_struct_print_f CauseRIC_print; +asn_constr_check_f CauseRIC_constraint; +ber_type_decoder_f CauseRIC_decode_ber; +der_type_encoder_f CauseRIC_encode_der; +xer_type_decoder_f CauseRIC_decode_xer; +xer_type_encoder_f CauseRIC_encode_xer; +oer_type_decoder_f CauseRIC_decode_oer; +oer_type_encoder_f CauseRIC_encode_oer; +per_type_decoder_f CauseRIC_decode_uper; +per_type_encoder_f CauseRIC_encode_uper; +per_type_decoder_f CauseRIC_decode_aper; +per_type_encoder_f CauseRIC_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseRIC_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CauseRICservice.c b/src/codec_utils/E2AP_MASTER/CauseRICservice.c new file mode 100644 index 000000000..2846bfefb --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseRICservice.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseRICservice.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseRICservice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseRICservice_value2enum_1[] = { + { 0, 21, "function-not-required" }, + { 1, 19, "excessive-functions" }, + { 2, 18, "ric-resource-limit" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseRICservice_enum2value_1[] = { + 1, /* excessive-functions(1) */ + 0, /* function-not-required(0) */ + 2 /* ric-resource-limit(2) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1 = { + asn_MAP_CauseRICservice_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseRICservice_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseRICservice_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseRICservice = { + "CauseRICservice", + "CauseRICservice", + &asn_OP_NativeEnumerated, + asn_DEF_CauseRICservice_tags_1, + sizeof(asn_DEF_CauseRICservice_tags_1) + /sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */ + asn_DEF_CauseRICservice_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseRICservice_tags_1) + /sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseRICservice_constr_1, &asn_PER_type_CauseRICservice_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseRICservice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseRICservice.h b/src/codec_utils/E2AP_MASTER/CauseRICservice.h new file mode 100644 index 000000000..cc6db2d18 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseRICservice.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseRICservice_H_ +#define _CauseRICservice_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseRICservice { + CauseRICservice_function_not_required = 0, + CauseRICservice_excessive_functions = 1, + CauseRICservice_ric_resource_limit = 2 + /* + * Enumeration is extensible + */ +} e_CauseRICservice; + +/* CauseRICservice */ +typedef long CauseRICservice_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseRICservice; +extern const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1; +asn_struct_free_f CauseRICservice_free; +asn_struct_print_f CauseRICservice_print; +asn_constr_check_f CauseRICservice_constraint; +ber_type_decoder_f CauseRICservice_decode_ber; +der_type_encoder_f CauseRICservice_encode_der; +xer_type_decoder_f CauseRICservice_decode_xer; +xer_type_encoder_f CauseRICservice_encode_xer; +oer_type_decoder_f CauseRICservice_decode_oer; +oer_type_encoder_f CauseRICservice_encode_oer; +per_type_decoder_f CauseRICservice_decode_uper; +per_type_encoder_f CauseRICservice_encode_uper; +per_type_decoder_f CauseRICservice_decode_aper; +per_type_encoder_f CauseRICservice_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseRICservice_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CauseTransport.c b/src/codec_utils/E2AP_MASTER/CauseTransport.c new file mode 100644 index 000000000..6189c270c --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseTransport.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseTransport.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseTransport_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseTransport_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseTransport_value2enum_1[] = { + { 0, 11, "unspecified" }, + { 1, 30, "transport-resource-unavailable" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseTransport_enum2value_1[] = { + 1, /* transport-resource-unavailable(1) */ + 0 /* unspecified(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1 = { + asn_MAP_CauseTransport_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseTransport_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseTransport_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseTransport = { + "CauseTransport", + "CauseTransport", + &asn_OP_NativeEnumerated, + asn_DEF_CauseTransport_tags_1, + sizeof(asn_DEF_CauseTransport_tags_1) + /sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */ + asn_DEF_CauseTransport_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseTransport_tags_1) + /sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseTransport_constr_1, &asn_PER_type_CauseTransport_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseTransport_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CauseTransport.h b/src/codec_utils/E2AP_MASTER/CauseTransport.h new file mode 100644 index 000000000..ec4550d12 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CauseTransport.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseTransport_H_ +#define _CauseTransport_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseTransport { + CauseTransport_unspecified = 0, + CauseTransport_transport_resource_unavailable = 1 + /* + * Enumeration is extensible + */ +} e_CauseTransport; + +/* CauseTransport */ +typedef long CauseTransport_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseTransport_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseTransport; +extern const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1; +asn_struct_free_f CauseTransport_free; +asn_struct_print_f CauseTransport_print; +asn_constr_check_f CauseTransport_constraint; +ber_type_decoder_f CauseTransport_decode_ber; +der_type_encoder_f CauseTransport_encode_der; +xer_type_decoder_f CauseTransport_decode_xer; +xer_type_encoder_f CauseTransport_encode_xer; +oer_type_decoder_f CauseTransport_decode_oer; +oer_type_encoder_f CauseTransport_encode_oer; +per_type_decoder_f CauseTransport_decode_uper; +per_type_encoder_f CauseTransport_encode_uper; +per_type_decoder_f CauseTransport_decode_aper; +per_type_encoder_f CauseTransport_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseTransport_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.c b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.c new file mode 100644 index 000000000..2c8702565 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnostics-IE-ItemE2.h" + +asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ItemE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, iECriticalityE2), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iECriticalityE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, iE_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iE-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, typeOfError), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TypeOfErrorE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "typeOfError" + }, +}; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_IE_ItemE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticalityE2 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* typeOfError */ +}; +asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1 = { + sizeof(struct CriticalityDiagnostics_IE_ItemE2), + offsetof(struct CriticalityDiagnostics_IE_ItemE2, _asn_ctx), + asn_MAP_CriticalityDiagnostics_IE_ItemE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ItemE2 = { + "CriticalityDiagnostics-IE-ItemE2", + "CriticalityDiagnostics-IE-ItemE2", + &asn_OP_SEQUENCE, + asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CriticalityDiagnostics_IE_ItemE2_1, + 3, /* Elements count */ + &asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.h b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.h new file mode 100644 index 000000000..701fc31ef --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ItemE2.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnostics_IE_ItemE2_H_ +#define _CriticalityDiagnostics_IE_ItemE2_H_ + + +#include + +/* Including external dependencies */ +#include "CriticalityE2.h" +#include "ProtocolIE-IDE2.h" +#include "TypeOfErrorE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* CriticalityDiagnostics-IE-ItemE2 */ +typedef struct CriticalityDiagnostics_IE_ItemE2 { + CriticalityE2_t iECriticalityE2; + ProtocolIE_IDE2_t iE_ID; + TypeOfErrorE2_t typeOfError; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnostics_IE_ItemE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ItemE2; +extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ItemE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnostics_IE_ItemE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.c b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.c new file mode 100644 index 000000000..c548688e7 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnostics-IE-ListE2.h" + +#include "CriticalityDiagnostics-IE-ItemE2.h" +static asn_oer_constraints_t asn_OER_type_CriticalityDiagnostics_IE_ListE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ListE2_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnostics_IE_ItemE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1 = { + sizeof(struct CriticalityDiagnostics_IE_ListE2), + offsetof(struct CriticalityDiagnostics_IE_ListE2, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ListE2 = { + "CriticalityDiagnostics-IE-ListE2", + "CriticalityDiagnostics-IE-ListE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[0]), /* 1 */ + { &asn_OER_type_CriticalityDiagnostics_IE_ListE2_constr_1, &asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_CriticalityDiagnostics_IE_ListE2_1, + 1, /* Single element */ + &asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.h b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.h new file mode 100644 index 000000000..6c0424df9 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnostics-IE-ListE2.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnostics_IE_ListE2_H_ +#define _CriticalityDiagnostics_IE_ListE2_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct CriticalityDiagnostics_IE_ItemE2; + +/* CriticalityDiagnostics-IE-ListE2 */ +typedef struct CriticalityDiagnostics_IE_ListE2 { + A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_ItemE2) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnostics_IE_ListE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ListE2; +extern asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ListE2_1[1]; +extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnostics_IE_ListE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.c b/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.c new file mode 100644 index 000000000..67cee5133 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnosticsE2.h" + +#include "RICrequestID.h" +#include "CriticalityDiagnostics-IE-ListE2.h" +static asn_TYPE_member_t asn_MBR_CriticalityDiagnosticsE2_1[] = { + { ATF_POINTER, 5, offsetof(struct CriticalityDiagnosticsE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_POINTER, 4, offsetof(struct CriticalityDiagnosticsE2, triggeringMessage), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TriggeringMessageE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "triggeringMessage" + }, + { ATF_POINTER, 3, offsetof(struct CriticalityDiagnosticsE2, procedureCriticality), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "procedureCriticality" + }, + { ATF_POINTER, 2, offsetof(struct CriticalityDiagnosticsE2, ricRequestorID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricRequestorID" + }, + { ATF_POINTER, 1, offsetof(struct CriticalityDiagnosticsE2, iEsCriticalityDiagnosticsE2), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityDiagnostics_IE_ListE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iEsCriticalityDiagnosticsE2" + }, +}; +static const int asn_MAP_CriticalityDiagnosticsE2_oms_1[] = { 0, 1, 2, 3, 4 }; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnosticsE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnosticsE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ricRequestorID */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iEsCriticalityDiagnosticsE2 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnosticsE2_specs_1 = { + sizeof(struct CriticalityDiagnosticsE2), + offsetof(struct CriticalityDiagnosticsE2, _asn_ctx), + asn_MAP_CriticalityDiagnosticsE2_tag2el_1, + 5, /* Count of tags in the map */ + asn_MAP_CriticalityDiagnosticsE2_oms_1, /* Optional members */ + 5, 0, /* Root/Additions */ + 5, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnosticsE2 = { + "CriticalityDiagnosticsE2", + "CriticalityDiagnosticsE2", + &asn_OP_SEQUENCE, + asn_DEF_CriticalityDiagnosticsE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnosticsE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CriticalityDiagnosticsE2_1, + 5, /* Elements count */ + &asn_SPC_CriticalityDiagnosticsE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.h b/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.h new file mode 100644 index 000000000..4cba2c711 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityDiagnosticsE2.h @@ -0,0 +1,52 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnosticsE2_H_ +#define _CriticalityDiagnosticsE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "TriggeringMessageE2.h" +#include "CriticalityE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICrequestID; +struct CriticalityDiagnostics_IE_ListE2; + +/* CriticalityDiagnosticsE2 */ +typedef struct CriticalityDiagnosticsE2 { + ProcedureCodeE2_t *procedureCode; /* OPTIONAL */ + TriggeringMessageE2_t *triggeringMessage; /* OPTIONAL */ + CriticalityE2_t *procedureCriticality; /* OPTIONAL */ + struct RICrequestID *ricRequestorID; /* OPTIONAL */ + struct CriticalityDiagnostics_IE_ListE2 *iEsCriticalityDiagnosticsE2; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnosticsE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnosticsE2; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnosticsE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/CriticalityE2.c b/src/codec_utils/E2AP_MASTER/CriticalityE2.c new file mode 100644 index 000000000..45a5d8728 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CriticalityE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CriticalityE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CriticalityE2_value2enum_1[] = { + { 0, 6, "reject" }, + { 1, 6, "ignore" }, + { 2, 6, "notify" } +}; +static const unsigned int asn_MAP_CriticalityE2_enum2value_1[] = { + 1, /* ignore(1) */ + 2, /* notify(2) */ + 0 /* reject(0) */ +}; +const asn_INTEGER_specifics_t asn_SPC_CriticalityE2_specs_1 = { + asn_MAP_CriticalityE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CriticalityE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CriticalityE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityE2 = { + "CriticalityE2", + "CriticalityE2", + &asn_OP_NativeEnumerated, + asn_DEF_CriticalityE2_tags_1, + sizeof(asn_DEF_CriticalityE2_tags_1) + /sizeof(asn_DEF_CriticalityE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityE2_tags_1) + /sizeof(asn_DEF_CriticalityE2_tags_1[0]), /* 1 */ + { &asn_OER_type_CriticalityE2_constr_1, &asn_PER_type_CriticalityE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CriticalityE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/CriticalityE2.h b/src/codec_utils/E2AP_MASTER/CriticalityE2.h new file mode 100644 index 000000000..fea39ba66 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/CriticalityE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityE2_H_ +#define _CriticalityE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CriticalityE2 { + CriticalityE2_reject = 0, + CriticalityE2_ignore = 1, + CriticalityE2_notify = 2 +} e_CriticalityE2; + +/* CriticalityE2 */ +typedef long CriticalityE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CriticalityE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CriticalityE2; +extern const asn_INTEGER_specifics_t asn_SPC_CriticalityE2_specs_1; +asn_struct_free_f CriticalityE2_free; +asn_struct_print_f CriticalityE2_print; +asn_constr_check_f CriticalityE2_constraint; +ber_type_decoder_f CriticalityE2_decode_ber; +der_type_encoder_f CriticalityE2_encode_der; +xer_type_decoder_f CriticalityE2_decode_xer; +xer_type_encoder_f CriticalityE2_encode_xer; +oer_type_decoder_f CriticalityE2_decode_oer; +oer_type_encoder_f CriticalityE2_encode_oer; +per_type_decoder_f CriticalityE2_decode_uper; +per_type_encoder_f CriticalityE2_encode_uper; +per_type_decoder_f CriticalityE2_decode_aper; +per_type_encoder_f CriticalityE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/E2AP-PDU.c b/src/codec_utils/E2AP_MASTER/E2AP-PDU.c new file mode 100644 index 000000000..da98a385f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2AP-PDU.c @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2AP-PDU.h" + +#include "InitiatingMessageE2.h" +#include "SuccessfulOutcomeE2.h" +#include "UnsuccessfulOutcomeE2.h" +static asn_oer_constraints_t asn_OER_type_E2AP_PDU_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_E2AP_PDU_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = { + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.initiatingMessage), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_InitiatingMessageE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "initiatingMessage" + }, + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.successfulOutcome), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SuccessfulOutcomeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "successfulOutcome" + }, + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.unsuccessfulOutcome), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_UnsuccessfulOutcomeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "unsuccessfulOutcome" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2AP_PDU_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* unsuccessfulOutcome */ +}; +static asn_CHOICE_specifics_t asn_SPC_E2AP_PDU_specs_1 = { + sizeof(struct E2AP_PDU), + offsetof(struct E2AP_PDU, _asn_ctx), + offsetof(struct E2AP_PDU, present), + sizeof(((struct E2AP_PDU *)0)->present), + asn_MAP_E2AP_PDU_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2AP_PDU = { + "E2AP-PDU", + "E2AP-PDU", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_E2AP_PDU_constr_1, &asn_PER_type_E2AP_PDU_constr_1, CHOICE_constraint }, + asn_MBR_E2AP_PDU_1, + 3, /* Elements count */ + &asn_SPC_E2AP_PDU_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/E2AP-PDU.h b/src/codec_utils/E2AP_MASTER/E2AP-PDU.h new file mode 100644 index 000000000..04086642d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2AP-PDU.h @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2AP_PDU_H_ +#define _E2AP_PDU_H_ + + +#include +#include +#include +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2AP_PDU_PR { + E2AP_PDU_PR_NOTHING, /* No components present */ + E2AP_PDU_PR_initiatingMessage, + E2AP_PDU_PR_successfulOutcome, + E2AP_PDU_PR_unsuccessfulOutcome + /* Extensions may appear below */ + +} E2AP_PDU_PR; + +/* Forward declarations */ +struct InitiatingMessageE2; +struct SuccessfulOutcomeE2; +struct UnsuccessfulOutcomeE2; + +/* E2AP-PDU */ +typedef struct E2AP_PDU { + E2AP_PDU_PR present; + union E2AP_PDU_u { + struct InitiatingMessageE2 *initiatingMessage; + struct SuccessfulOutcomeE2 *successfulOutcome; + struct UnsuccessfulOutcomeE2 *unsuccessfulOutcome; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2AP_PDU_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2AP_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2AP_PDU_H_ */ +#include diff --git a/src/codec_utils/E2AP/E2AP.asn1 b/src/codec_utils/E2AP_MASTER/E2AP.asn1 similarity index 100% rename from src/codec_utils/E2AP/E2AP.asn1 rename to src/codec_utils/E2AP_MASTER/E2AP.asn1 diff --git a/src/codec_utils/E2AP_MASTER/E2setupFailure.c b/src/codec_utils/E2AP_MASTER/E2setupFailure.c new file mode 100644 index 000000000..83d21ef79 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupFailure.h" + +asn_TYPE_member_t asn_MBR_E2setupFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P13, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1 = { + sizeof(struct E2setupFailure), + offsetof(struct E2setupFailure, _asn_ctx), + asn_MAP_E2setupFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupFailure = { + "E2setupFailure", + "E2setupFailure", + &asn_OP_SEQUENCE, + asn_DEF_E2setupFailure_tags_1, + sizeof(asn_DEF_E2setupFailure_tags_1) + /sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */ + asn_DEF_E2setupFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupFailure_tags_1) + /sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupFailure_1, + 1, /* Elements count */ + &asn_SPC_E2setupFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/E2setupFailure.h b/src/codec_utils/E2AP_MASTER/E2setupFailure.h new file mode 100644 index 000000000..22bf6ac5a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupFailure_H_ +#define _E2setupFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupFailure */ +typedef struct E2setupFailure { + ProtocolIE_ContainerE2_1407P13_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/E2setupRequest.c b/src/codec_utils/E2AP_MASTER/E2setupRequest.c new file mode 100644 index 000000000..fcd8a379d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupRequest.h" + +asn_TYPE_member_t asn_MBR_E2setupRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P11, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1 = { + sizeof(struct E2setupRequest), + offsetof(struct E2setupRequest, _asn_ctx), + asn_MAP_E2setupRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupRequest = { + "E2setupRequest", + "E2setupRequest", + &asn_OP_SEQUENCE, + asn_DEF_E2setupRequest_tags_1, + sizeof(asn_DEF_E2setupRequest_tags_1) + /sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */ + asn_DEF_E2setupRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupRequest_tags_1) + /sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupRequest_1, + 1, /* Elements count */ + &asn_SPC_E2setupRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/E2setupRequest.h b/src/codec_utils/E2AP_MASTER/E2setupRequest.h new file mode 100644 index 000000000..283c8cab8 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupRequest_H_ +#define _E2setupRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupRequest */ +typedef struct E2setupRequest { + ProtocolIE_ContainerE2_1407P11_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/E2setupResponse.c b/src/codec_utils/E2AP_MASTER/E2setupResponse.c new file mode 100644 index 000000000..5a9943af4 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupResponse.h" + +asn_TYPE_member_t asn_MBR_E2setupResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P12, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1 = { + sizeof(struct E2setupResponse), + offsetof(struct E2setupResponse, _asn_ctx), + asn_MAP_E2setupResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupResponse = { + "E2setupResponse", + "E2setupResponse", + &asn_OP_SEQUENCE, + asn_DEF_E2setupResponse_tags_1, + sizeof(asn_DEF_E2setupResponse_tags_1) + /sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */ + asn_DEF_E2setupResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupResponse_tags_1) + /sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupResponse_1, + 1, /* Elements count */ + &asn_SPC_E2setupResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/E2setupResponse.h b/src/codec_utils/E2AP_MASTER/E2setupResponse.h new file mode 100644 index 000000000..e1ae8e898 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/E2setupResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupResponse_H_ +#define _E2setupResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupResponse */ +typedef struct E2setupResponse { + ProtocolIE_ContainerE2_1407P12_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.c b/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.c new file mode 100644 index 000000000..34a2970f1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.c @@ -0,0 +1,192 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID-Choice.h" + +static int +memb_enb_ID_macro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_shortmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_macro), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_macro_constr_2, &asn_PER_memb_enb_ID_macro_constr_2, memb_enb_ID_macro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-macro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_shortmacro), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_shortmacro_constr_3, &asn_PER_memb_enb_ID_shortmacro_constr_3, memb_enb_ID_shortmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-shortmacro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_longmacro), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_longmacro_constr_4, &asn_PER_memb_enb_ID_longmacro_constr_4, memb_enb_ID_longmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-longmacro" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* enb-ID-macro */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* enb-ID-shortmacro */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* enb-ID-longmacro */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1 = { + sizeof(struct ENB_ID_Choice), + offsetof(struct ENB_ID_Choice, _asn_ctx), + offsetof(struct ENB_ID_Choice, present), + sizeof(((struct ENB_ID_Choice *)0)->present), + asn_MAP_ENB_ID_Choice_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice = { + "ENB-ID-Choice", + "ENB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_Choice_constr_1, &asn_PER_type_ENB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_Choice_1, + 3, /* Elements count */ + &asn_SPC_ENB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.h b/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.h new file mode 100644 index 000000000..c9a3b4008 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENB-ID-Choice.h @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_Choice_H_ +#define _ENB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_Choice_PR { + ENB_ID_Choice_PR_NOTHING, /* No components present */ + ENB_ID_Choice_PR_enb_ID_macro, + ENB_ID_Choice_PR_enb_ID_shortmacro, + ENB_ID_Choice_PR_enb_ID_longmacro + /* Extensions may appear below */ + +} ENB_ID_Choice_PR; + +/* ENB-ID-Choice */ +typedef struct ENB_ID_Choice { + ENB_ID_Choice_PR present; + union ENB_ID_Choice_u { + BIT_STRING_t enb_ID_macro; + BIT_STRING_t enb_ID_shortmacro; + BIT_STRING_t enb_ID_longmacro; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[3]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ENB-ID.c b/src/codec_utils/E2AP_MASTER/ENB-ID.c new file mode 100644 index 000000000..01894152f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENB-ID.c @@ -0,0 +1,241 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID.h" + +static int +memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 28)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 28 /* (SIZE(28..28)) */}; +static asn_per_constraints_t asn_PER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 28, 28 } /* (SIZE(28..28)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_macro_eNB_ID_constr_2, &asn_PER_memb_macro_eNB_ID_constr_2, memb_macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.home_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_home_eNB_ID_constr_3, &asn_PER_memb_home_eNB_ID_constr_3, memb_home_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "home-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.short_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_short_Macro_eNB_ID_constr_5, &asn_PER_memb_short_Macro_eNB_ID_constr_5, memb_short_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "short-Macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.long_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_long_Macro_eNB_ID_constr_6, &asn_PER_memb_long_Macro_eNB_ID_constr_6, memb_long_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "long-Macro-eNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1 = { + sizeof(struct ENB_ID), + offsetof(struct ENB_ID, _asn_ctx), + offsetof(struct ENB_ID, present), + sizeof(((struct ENB_ID *)0)->present), + asn_MAP_ENB_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID = { + "ENB-ID", + "ENB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_constr_1, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_1, + 4, /* Elements count */ + &asn_SPC_ENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ENB-ID.h b/src/codec_utils/E2AP_MASTER/ENB-ID.h new file mode 100644 index 000000000..e64a39d9b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENB-ID.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_H_ +#define _ENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_PR { + ENB_ID_PR_NOTHING, /* No components present */ + ENB_ID_PR_macro_eNB_ID, + ENB_ID_PR_home_eNB_ID, + /* Extensions may appear below */ + ENB_ID_PR_short_Macro_eNB_ID, + ENB_ID_PR_long_Macro_eNB_ID +} ENB_ID_PR; + +/* ENB-ID */ +typedef struct ENB_ID { + ENB_ID_PR present; + union ENB_ID_u { + BIT_STRING_t macro_eNB_ID; + BIT_STRING_t home_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + BIT_STRING_t short_Macro_eNB_ID; + BIT_STRING_t long_Macro_eNB_ID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ENGNB-ID.c b/src/codec_utils/E2AP_MASTER/ENGNB-ID.c new file mode 100644 index 000000000..be3e5926f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENGNB-ID.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENGNB-ID.h" + +static int +memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENGNB_ID, choice.gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gNB_ID_constr_2, &asn_PER_memb_gNB_ID_constr_2, memb_gNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1 = { + sizeof(struct ENGNB_ID), + offsetof(struct ENGNB_ID, _asn_ctx), + offsetof(struct ENGNB_ID, present), + sizeof(((struct ENGNB_ID *)0)->present), + asn_MAP_ENGNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENGNB_ID = { + "ENGNB-ID", + "ENGNB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENGNB_ID_constr_1, &asn_PER_type_ENGNB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENGNB_ID_1, + 1, /* Elements count */ + &asn_SPC_ENGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ENGNB-ID.h b/src/codec_utils/E2AP_MASTER/ENGNB-ID.h new file mode 100644 index 000000000..13002af16 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ENGNB-ID.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENGNB_ID_H_ +#define _ENGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENGNB_ID_PR { + ENGNB_ID_PR_NOTHING, /* No components present */ + ENGNB_ID_PR_gNB_ID + /* Extensions may appear below */ + +} ENGNB_ID_PR; + +/* ENGNB-ID */ +typedef struct ENGNB_ID { + ENGNB_ID_PR present; + union ENGNB_ID_u { + BIT_STRING_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENGNB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENGNB_ID_1[1]; +extern asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.c b/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.c new file mode 100644 index 000000000..027208428 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ErrorIndicationE2.h" + +asn_TYPE_member_t asn_MBR_ErrorIndicationE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P10, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ErrorIndicationE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ErrorIndicationE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_specs_1 = { + sizeof(struct ErrorIndicationE2), + offsetof(struct ErrorIndicationE2, _asn_ctx), + asn_MAP_ErrorIndicationE2_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2 = { + "ErrorIndicationE2", + "ErrorIndicationE2", + &asn_OP_SEQUENCE, + asn_DEF_ErrorIndicationE2_tags_1, + sizeof(asn_DEF_ErrorIndicationE2_tags_1) + /sizeof(asn_DEF_ErrorIndicationE2_tags_1[0]), /* 1 */ + asn_DEF_ErrorIndicationE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ErrorIndicationE2_tags_1) + /sizeof(asn_DEF_ErrorIndicationE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ErrorIndicationE2_1, + 1, /* Elements count */ + &asn_SPC_ErrorIndicationE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.h b/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.h new file mode 100644 index 000000000..8b752e23a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ErrorIndicationE2.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ErrorIndicationE2_H_ +#define _ErrorIndicationE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ErrorIndicationE2 */ +typedef struct ErrorIndicationE2 { + ProtocolIE_ContainerE2_1407P10_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ErrorIndicationE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_specs_1; +extern asn_TYPE_member_t asn_MBR_ErrorIndicationE2_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ErrorIndicationE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.c b/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.c new file mode 100644 index 000000000..8a017d742 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-CU-UP-ID.h" + +int +GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = { + "GNB-CU-UP-ID", + "GNB-CU-UP-ID", + &asn_OP_INTEGER, + asn_DEF_GNB_CU_UP_ID_tags_1, + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + asn_DEF_GNB_CU_UP_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_CU_UP_ID_constr_1, &asn_PER_type_GNB_CU_UP_ID_constr_1, GNB_CU_UP_ID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.h b/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.h new file mode 100644 index 000000000..7bf479d90 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-CU-UP-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_CU_UP_ID_H_ +#define _GNB_CU_UP_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-CU-UP-ID */ +typedef INTEGER_t GNB_CU_UP_ID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID; +asn_struct_free_f GNB_CU_UP_ID_free; +asn_struct_print_f GNB_CU_UP_ID_print; +asn_constr_check_f GNB_CU_UP_ID_constraint; +ber_type_decoder_f GNB_CU_UP_ID_decode_ber; +der_type_encoder_f GNB_CU_UP_ID_encode_der; +xer_type_decoder_f GNB_CU_UP_ID_decode_xer; +xer_type_encoder_f GNB_CU_UP_ID_encode_xer; +oer_type_decoder_f GNB_CU_UP_ID_decode_oer; +oer_type_encoder_f GNB_CU_UP_ID_encode_oer; +per_type_decoder_f GNB_CU_UP_ID_decode_uper; +per_type_encoder_f GNB_CU_UP_ID_encode_uper; +per_type_decoder_f GNB_CU_UP_ID_decode_aper; +per_type_encoder_f GNB_CU_UP_ID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_CU_UP_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.c b/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.c new file mode 100644 index 000000000..52ec04099 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-DU-IDE2.h" + +int +GNB_DU_IDE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_DU_IDE2_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_DU_IDE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_DU_IDE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_DU_IDE2 = { + "GNB-DU-IDE2", + "GNB-DU-IDE2", + &asn_OP_INTEGER, + asn_DEF_GNB_DU_IDE2_tags_1, + sizeof(asn_DEF_GNB_DU_IDE2_tags_1) + /sizeof(asn_DEF_GNB_DU_IDE2_tags_1[0]), /* 1 */ + asn_DEF_GNB_DU_IDE2_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_DU_IDE2_tags_1) + /sizeof(asn_DEF_GNB_DU_IDE2_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_DU_IDE2_constr_1, &asn_PER_type_GNB_DU_IDE2_constr_1, GNB_DU_IDE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.h b/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.h new file mode 100644 index 000000000..e190ee099 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-DU-IDE2.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_DU_IDE2_H_ +#define _GNB_DU_IDE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-DU-IDE2 */ +typedef INTEGER_t GNB_DU_IDE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_DU_IDE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_DU_IDE2; +asn_struct_free_f GNB_DU_IDE2_free; +asn_struct_print_f GNB_DU_IDE2_print; +asn_constr_check_f GNB_DU_IDE2_constraint; +ber_type_decoder_f GNB_DU_IDE2_decode_ber; +der_type_encoder_f GNB_DU_IDE2_encode_der; +xer_type_decoder_f GNB_DU_IDE2_decode_xer; +xer_type_encoder_f GNB_DU_IDE2_encode_xer; +oer_type_decoder_f GNB_DU_IDE2_decode_oer; +oer_type_encoder_f GNB_DU_IDE2_encode_oer; +per_type_decoder_f GNB_DU_IDE2_decode_uper; +per_type_encoder_f GNB_DU_IDE2_encode_uper; +per_type_decoder_f GNB_DU_IDE2_decode_aper; +per_type_encoder_f GNB_DU_IDE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_DU_IDE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.c b/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.c new file mode 100644 index 000000000..a9284595e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-ID-Choice.h" + +static int +memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GNB_ID_Choice, choice.gnb_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gnb_ID_constr_2, &asn_PER_memb_gnb_ID_constr_2, memb_gnb_ID_constraint_1 }, + 0, 0, /* No default value */ + "gnb-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GNB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gnb-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1 = { + sizeof(struct GNB_ID_Choice), + offsetof(struct GNB_ID_Choice, _asn_ctx), + offsetof(struct GNB_ID_Choice, present), + sizeof(((struct GNB_ID_Choice *)0)->present), + asn_MAP_GNB_ID_Choice_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice = { + "GNB-ID-Choice", + "GNB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GNB_ID_Choice_constr_1, &asn_PER_type_GNB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_GNB_ID_Choice_1, + 1, /* Elements count */ + &asn_SPC_GNB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.h b/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.h new file mode 100644 index 000000000..ef1008775 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GNB-ID-Choice.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_ID_Choice_H_ +#define _GNB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GNB_ID_Choice_PR { + GNB_ID_Choice_PR_NOTHING, /* No components present */ + GNB_ID_Choice_PR_gnb_ID + /* Extensions may appear below */ + +} GNB_ID_Choice_PR; + +/* GNB-ID-Choice */ +typedef struct GNB_ID_Choice { + GNB_ID_Choice_PR present; + union GNB_ID_Choice_u { + BIT_STRING_t gnb_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GNB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[1]; +extern asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.c b/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.c new file mode 100644 index 000000000..3cfd04151 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.c @@ -0,0 +1,89 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-ID.h" + +#include "GlobalE2node-gNB-ID.h" +#include "GlobalE2node-en-gNB-ID.h" +#include "GlobalE2node-ng-eNB-ID.h" +#include "GlobalE2node-eNB-ID.h" +static asn_oer_constraints_t asn_OER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = { + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.gNB), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.en_gNB), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_en_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "en-gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.ng_eNB), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_ng_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ng-eNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.eNB), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* eNB */ +}; +static asn_CHOICE_specifics_t asn_SPC_GlobalE2node_ID_specs_1 = { + sizeof(struct GlobalE2node_ID), + offsetof(struct GlobalE2node_ID, _asn_ctx), + offsetof(struct GlobalE2node_ID, present), + sizeof(((struct GlobalE2node_ID *)0)->present), + asn_MAP_GlobalE2node_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 4 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID = { + "GlobalE2node-ID", + "GlobalE2node-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GlobalE2node_ID_constr_1, &asn_PER_type_GlobalE2node_ID_constr_1, CHOICE_constraint }, + asn_MBR_GlobalE2node_ID_1, + 4, /* Elements count */ + &asn_SPC_GlobalE2node_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.h b/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.h new file mode 100644 index 000000000..0596af74f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-ID.h @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_ID_H_ +#define _GlobalE2node_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GlobalE2node_ID_PR { + GlobalE2node_ID_PR_NOTHING, /* No components present */ + GlobalE2node_ID_PR_gNB, + GlobalE2node_ID_PR_en_gNB, + GlobalE2node_ID_PR_ng_eNB, + GlobalE2node_ID_PR_eNB + /* Extensions may appear below */ + +} GlobalE2node_ID_PR; + +/* Forward declarations */ +struct GlobalE2node_gNB_ID; +struct GlobalE2node_en_gNB_ID; +struct GlobalE2node_ng_eNB_ID; +struct GlobalE2node_eNB_ID; + +/* GlobalE2node-ID */ +typedef struct GlobalE2node_ID { + GlobalE2node_ID_PR present; + union GlobalE2node_ID_u { + struct GlobalE2node_gNB_ID *gNB; + struct GlobalE2node_en_gNB_ID *en_gNB; + struct GlobalE2node_ng_eNB_ID *ng_eNB; + struct GlobalE2node_eNB_ID *eNB; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.c new file mode 100644 index 000000000..2003c6c4a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_eNB_ID, global_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1 = { + sizeof(struct GlobalE2node_eNB_ID), + offsetof(struct GlobalE2node_eNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID = { + "GlobalE2node-eNB-ID", + "GlobalE2node-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.h new file mode 100644 index 000000000..dadf6db3e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_eNB_ID_H_ +#define _GlobalE2node_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-eNB-ID */ +typedef struct GlobalE2node_eNB_ID { + GlobalENB_ID_t global_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.c new file mode 100644 index 000000000..dc4a324b1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-en-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_en_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalenGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_en_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1 = { + sizeof(struct GlobalE2node_en_gNB_ID), + offsetof(struct GlobalE2node_en_gNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID = { + "GlobalE2node-en-gNB-ID", + "GlobalE2node-en-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_en_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_en_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_en_gNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_en_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.h new file mode 100644 index 000000000..ab6b6ff78 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-en-gNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_en_gNB_ID_H_ +#define _GlobalE2node_en_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalenGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-en-gNB-ID */ +typedef struct GlobalE2node_en_gNB_ID { + GlobalenGNB_ID_t global_gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_en_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_en_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.c new file mode 100644 index 000000000..fe1831520 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.c @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalgNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, + { ATF_POINTER, 2, offsetof(struct GlobalE2node_gNB_ID, gNB_CU_UP_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-CU-UP-ID" + }, + { ATF_POINTER, 1, offsetof(struct GlobalE2node_gNB_ID, gNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_DU_IDE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-DU-ID" + }, +}; +static const int asn_MAP_GlobalE2node_gNB_ID_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-gNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-CU-UP-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gNB-DU-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1 = { + sizeof(struct GlobalE2node_gNB_ID), + offsetof(struct GlobalE2node_gNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_gNB_ID_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_GlobalE2node_gNB_ID_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID = { + "GlobalE2node-gNB-ID", + "GlobalE2node-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_gNB_ID_1, + 3, /* Elements count */ + &asn_SPC_GlobalE2node_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.h new file mode 100644 index 000000000..3eb603645 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-gNB-ID.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_gNB_ID_H_ +#define _GlobalE2node_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalgNB-ID.h" +#include "GNB-CU-UP-ID.h" +#include "GNB-DU-IDE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-gNB-ID */ +typedef struct GlobalE2node_gNB_ID { + GlobalgNB_ID_t global_gNB_ID; + GNB_CU_UP_ID_t *gNB_CU_UP_ID; /* OPTIONAL */ + GNB_DU_IDE2_t *gNB_DU_ID; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.c new file mode 100644 index 000000000..2653a0001 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-ng-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ng_eNB_ID, global_ng_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalngeNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-ng-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-ng-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 = { + sizeof(struct GlobalE2node_ng_eNB_ID), + offsetof(struct GlobalE2node_ng_eNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID = { + "GlobalE2node-ng-eNB-ID", + "GlobalE2node-ng-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_ng_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_ng_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_ng_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.h new file mode 100644 index 000000000..93b0b6015 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalE2node-ng-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_ng_eNB_ID_H_ +#define _GlobalE2node_ng_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalngeNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-ng-eNB-ID */ +typedef struct GlobalE2node_ng_eNB_ID { + GlobalngeNB_ID_t global_ng_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_ng_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_ng_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalENB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalENB-ID.c new file mode 100644 index 000000000..b0d89807e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalENB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalENB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1 = { + sizeof(struct GlobalENB_ID), + offsetof(struct GlobalENB_ID, _asn_ctx), + asn_MAP_GlobalENB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = { + "GlobalENB-ID", + "GlobalENB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalENB_ID_tags_1, + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalENB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalENB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalENB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalENB-ID.h new file mode 100644 index 000000000..a9417954a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalENB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalENB_ID_H_ +#define _GlobalENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalENB-ID */ +typedef struct GlobalENB_ID { + PLMN_IdentityE2_t pLMN_Identity; + ENB_ID_t eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.c b/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.c new file mode 100644 index 000000000..245ec55ad --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.c @@ -0,0 +1,99 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalRIC-ID.h" + +static int +memb_ric_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_ric_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_ric_ID_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_GlobalRIC_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, ric_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_ric_ID_constr_3, &asn_PER_memb_ric_ID_constr_3, memb_ric_ID_constraint_1 }, + 0, 0, /* No default value */ + "ric-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalRIC_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalRIC_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ric-ID */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_GlobalRIC_ID_specs_1 = { + sizeof(struct GlobalRIC_ID), + offsetof(struct GlobalRIC_ID, _asn_ctx), + asn_MAP_GlobalRIC_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID = { + "GlobalRIC-ID", + "GlobalRIC-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalRIC_ID_tags_1, + sizeof(asn_DEF_GlobalRIC_ID_tags_1) + /sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalRIC_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalRIC_ID_tags_1) + /sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalRIC_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalRIC_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.h b/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.h new file mode 100644 index 000000000..43ef3672e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalRIC-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalRIC_ID_H_ +#define _GlobalRIC_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalRIC-ID */ +typedef struct GlobalRIC_ID { + PLMN_IdentityE2_t pLMN_Identity; + BIT_STRING_t ric_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalRIC_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalRIC_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.c new file mode 100644 index 000000000..57c4d227a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalenGNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalenGNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalenGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1 = { + sizeof(struct GlobalenGNB_ID), + offsetof(struct GlobalenGNB_ID, _asn_ctx), + asn_MAP_GlobalenGNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = { + "GlobalenGNB-ID", + "GlobalenGNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalenGNB_ID_tags_1, + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalenGNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalenGNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalenGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.h new file mode 100644 index 000000000..793d3992d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalenGNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalenGNB_ID_H_ +#define _GlobalenGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalenGNB-ID */ +typedef struct GlobalenGNB_ID { + PLMN_IdentityE2_t pLMN_Identity; + ENGNB_ID_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalenGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalenGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.c new file mode 100644 index 000000000..d7f1ce6a9 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalgNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, gnb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GNB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gnb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalgNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalgNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gnb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1 = { + sizeof(struct GlobalgNB_ID), + offsetof(struct GlobalgNB_ID, _asn_ctx), + asn_MAP_GlobalgNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID = { + "GlobalgNB-ID", + "GlobalgNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalgNB_ID_tags_1, + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalgNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalgNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalgNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.h new file mode 100644 index 000000000..e3749a421 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalgNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalgNB_ID_H_ +#define _GlobalgNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "GNB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalgNB-ID */ +typedef struct GlobalgNB_ID { + PLMN_IdentityE2_t plmn_id; + GNB_ID_Choice_t gnb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalgNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalgNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.c b/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.c new file mode 100644 index 000000000..8b65d9738 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalngeNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, enb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "enb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalngeNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalngeNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1 = { + sizeof(struct GlobalngeNB_ID), + offsetof(struct GlobalngeNB_ID, _asn_ctx), + asn_MAP_GlobalngeNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID = { + "GlobalngeNB-ID", + "GlobalngeNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalngeNB_ID_tags_1, + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalngeNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalngeNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalngeNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.h b/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.h new file mode 100644 index 000000000..5ededc6d7 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/GlobalngeNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalngeNB_ID_H_ +#define _GlobalngeNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalngeNB-ID */ +typedef struct GlobalngeNB_ID { + PLMN_IdentityE2_t plmn_id; + ENB_ID_Choice_t enb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalngeNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalngeNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.c b/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.c new file mode 100644 index 000000000..3f6985983 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.c @@ -0,0 +1,398 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "InitiatingMessageE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_InitiatingMessageE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessageE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_InitiatingMessageE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 0; /* &InitiatingMessageE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessageE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICsubscriptionRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICsubscriptionDeleteRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICserviceUpdate), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdate, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdate" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICcontrolRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.E2setupRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.ResetRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ResetRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICindication), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICindication, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindication" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICserviceQuery), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceQuery, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceQuery" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.ErrorIndicationE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ErrorIndicationE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ErrorIndicationE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 8 }, /* RICsubscriptionRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 7 }, /* RICsubscriptionDeleteRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 6 }, /* RICserviceUpdate */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 5 }, /* RICcontrolRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 4 }, /* E2setupRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 3 }, /* ResetRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 2 }, /* RICindication */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 1 }, /* RICserviceQuery */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 0 } /* ErrorIndicationE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct InitiatingMessageE2__value), + offsetof(struct InitiatingMessageE2__value, _asn_ctx), + offsetof(struct InitiatingMessageE2__value, present), + sizeof(((struct InitiatingMessageE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 9, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 9, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_InitiatingMessageE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_InitiatingMessageE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_InitiatingMessageE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_InitiatingMessageE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_InitiatingMessageE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessageE2_specs_1 = { + sizeof(struct InitiatingMessageE2), + offsetof(struct InitiatingMessageE2, _asn_ctx), + asn_MAP_InitiatingMessageE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_InitiatingMessageE2 = { + "InitiatingMessageE2", + "InitiatingMessageE2", + &asn_OP_SEQUENCE, + asn_DEF_InitiatingMessageE2_tags_1, + sizeof(asn_DEF_InitiatingMessageE2_tags_1) + /sizeof(asn_DEF_InitiatingMessageE2_tags_1[0]), /* 1 */ + asn_DEF_InitiatingMessageE2_tags_1, /* Same as above */ + sizeof(asn_DEF_InitiatingMessageE2_tags_1) + /sizeof(asn_DEF_InitiatingMessageE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_InitiatingMessageE2_1, + 3, /* Elements count */ + &asn_SPC_InitiatingMessageE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.h b/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.h new file mode 100644 index 000000000..6d8baa4c3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/InitiatingMessageE2.h @@ -0,0 +1,97 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _InitiatingMessageE2_H_ +#define _InitiatingMessageE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum InitiatingMessageE2__value_PR { + InitiatingMessageE2__value_PR_NOTHING, /* No components present */ + InitiatingMessageE2__value_PR_RICsubscriptionRequest, + InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest, + InitiatingMessageE2__value_PR_RICserviceUpdate, + InitiatingMessageE2__value_PR_RICcontrolRequest, + InitiatingMessageE2__value_PR_E2setupRequest, + InitiatingMessageE2__value_PR_ResetRequest, + InitiatingMessageE2__value_PR_RICindication, + InitiatingMessageE2__value_PR_RICserviceQuery, + InitiatingMessageE2__value_PR_ErrorIndicationE2 +} InitiatingMessageE2__value_PR; + +/* InitiatingMessageE2 */ +typedef struct InitiatingMessageE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct InitiatingMessageE2__value { + InitiatingMessageE2__value_PR present; + union InitiatingMessageE2__value_u { + RICsubscriptionRequest_t RICsubscriptionRequest; + RICsubscriptionDeleteRequest_t RICsubscriptionDeleteRequest; + RICserviceUpdate_t RICserviceUpdate; + RICcontrolRequest_t RICcontrolRequest; + E2setupRequest_t E2setupRequest; + ResetRequest_t ResetRequest; + RICindication_t RICindication; + RICserviceQuery_t RICserviceQuery; + ErrorIndicationE2_t ErrorIndicationE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} InitiatingMessageE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_InitiatingMessageE2; +extern asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessageE2_specs_1; +extern asn_TYPE_member_t asn_MBR_InitiatingMessageE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _InitiatingMessageE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/Makefile.am.libasncodec b/src/codec_utils/E2AP_MASTER/Makefile.am.libasncodec new file mode 100644 index 000000000..76d673614 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/Makefile.am.libasncodec @@ -0,0 +1,288 @@ +ASN_MODULE_SRCS= \ + ./out/E2AP-PDU.c \ + ./out/InitiatingMessageE2.c \ + ./out/SuccessfulOutcomeE2.c \ + ./out/UnsuccessfulOutcomeE2.c \ + ./out/RICsubscriptionRequest.c \ + ./out/RICsubscriptionDetails.c \ + ./out/RICactions-ToBeSetup-List.c \ + ./out/RICaction-ToBeSetup-Item.c \ + ./out/RICsubscriptionResponse.c \ + ./out/RICaction-Admitted-List.c \ + ./out/RICaction-Admitted-Item.c \ + ./out/RICaction-NotAdmitted-List.c \ + ./out/RICaction-NotAdmitted-Item.c \ + ./out/RICsubscriptionFailure.c \ + ./out/RICsubscriptionDeleteRequest.c \ + ./out/RICsubscriptionDeleteResponse.c \ + ./out/RICsubscriptionDeleteFailure.c \ + ./out/RICindication.c \ + ./out/RICcontrolRequest.c \ + ./out/RICcontrolAcknowledge.c \ + ./out/RICcontrolFailure.c \ + ./out/ErrorIndicationE2.c \ + ./out/E2setupRequest.c \ + ./out/E2setupResponse.c \ + ./out/E2setupFailure.c \ + ./out/ResetRequest.c \ + ./out/ResetResponse.c \ + ./out/RICserviceUpdate.c \ + ./out/RANfunctions-List.c \ + ./out/RANfunction-Item.c \ + ./out/RANfunctionsID-List.c \ + ./out/RANfunctionID-Item.c \ + ./out/RICserviceUpdateAcknowledge.c \ + ./out/RANfunctionsIDcause-List.c \ + ./out/RANfunctionIDcause-Item.c \ + ./out/RICserviceUpdateFailure.c \ + ./out/RICserviceQuery.c \ + ./out/CauseE2.c \ + ./out/CauseMisc.c \ + ./out/CauseProtocol.c \ + ./out/CauseRIC.c \ + ./out/CauseRICservice.c \ + ./out/CauseTransport.c \ + ./out/CriticalityDiagnosticsE2.c \ + ./out/CriticalityDiagnostics-IE-ListE2.c \ + ./out/CriticalityDiagnostics-IE-ItemE2.c \ + ./out/ENB-ID.c \ + ./out/ENB-ID-Choice.c \ + ./out/ENGNB-ID.c \ + ./out/GlobalE2node-ID.c \ + ./out/GlobalE2node-en-gNB-ID.c \ + ./out/GlobalE2node-eNB-ID.c \ + ./out/GlobalE2node-gNB-ID.c \ + ./out/GlobalE2node-ng-eNB-ID.c \ + ./out/GlobalENB-ID.c \ + ./out/GlobalenGNB-ID.c \ + ./out/GlobalgNB-ID.c \ + ./out/GlobalngeNB-ID.c \ + ./out/GlobalRIC-ID.c \ + ./out/GNB-CU-UP-ID.c \ + ./out/GNB-DU-IDE2.c \ + ./out/GNB-ID-Choice.c \ + ./out/PLMN-IdentityE2.c \ + ./out/RANfunctionDefinition.c \ + ./out/RANfunctionID.c \ + ./out/RANfunctionRevision.c \ + ./out/RICactionDefinition.c \ + ./out/RICactionID.c \ + ./out/RICactionType.c \ + ./out/RICcallProcessID.c \ + ./out/RICcontrolAckRequest.c \ + ./out/RICcontrolHeader.c \ + ./out/RICcontrolMessage.c \ + ./out/RICcontrolOutcome.c \ + ./out/RICcontrolStatus.c \ + ./out/RICeventTriggerDefinition.c \ + ./out/RICindicationHeader.c \ + ./out/RICindicationMessage.c \ + ./out/RICindicationSN.c \ + ./out/RICindicationType.c \ + ./out/RICrequestID.c \ + ./out/RICsubsequentAction.c \ + ./out/RICsubsequentActionType.c \ + ./out/RICtimeToWait.c \ + ./out/TimeToWaitE2.c \ + ./out/TypeOfErrorE2.c \ + ./out/CriticalityE2.c \ + ./out/PresenceE2.c \ + ./out/ProcedureCodeE2.c \ + ./out/ProtocolIE-IDE2.c \ + ./out/TriggeringMessageE2.c \ + ./out/ProtocolIE-ContainerE2.c \ + ./out/ProtocolIE-SingleContainerE2.c \ + ./out/ProtocolIE-FieldE2.c \ + ./out/ProtocolIE-ContainerPairE2.c \ + ./out/ProtocolIE-FieldPairE2.c \ + ./out/ProtocolIE-ContainerList.c \ + ./out/ProtocolIE-ContainerPairList.c + +ASN_MODULE_HDRS= \ + ./out/E2AP-PDU.h \ + ./out/InitiatingMessageE2.h \ + ./out/SuccessfulOutcomeE2.h \ + ./out/UnsuccessfulOutcomeE2.h \ + ./out/RICsubscriptionRequest.h \ + ./out/RICsubscriptionDetails.h \ + ./out/RICactions-ToBeSetup-List.h \ + ./out/RICaction-ToBeSetup-Item.h \ + ./out/RICsubscriptionResponse.h \ + ./out/RICaction-Admitted-List.h \ + ./out/RICaction-Admitted-Item.h \ + ./out/RICaction-NotAdmitted-List.h \ + ./out/RICaction-NotAdmitted-Item.h \ + ./out/RICsubscriptionFailure.h \ + ./out/RICsubscriptionDeleteRequest.h \ + ./out/RICsubscriptionDeleteResponse.h \ + ./out/RICsubscriptionDeleteFailure.h \ + ./out/RICindication.h \ + ./out/RICcontrolRequest.h \ + ./out/RICcontrolAcknowledge.h \ + ./out/RICcontrolFailure.h \ + ./out/ErrorIndicationE2.h \ + ./out/E2setupRequest.h \ + ./out/E2setupResponse.h \ + ./out/E2setupFailure.h \ + ./out/ResetRequest.h \ + ./out/ResetResponse.h \ + ./out/RICserviceUpdate.h \ + ./out/RANfunctions-List.h \ + ./out/RANfunction-Item.h \ + ./out/RANfunctionsID-List.h \ + ./out/RANfunctionID-Item.h \ + ./out/RICserviceUpdateAcknowledge.h \ + ./out/RANfunctionsIDcause-List.h \ + ./out/RANfunctionIDcause-Item.h \ + ./out/RICserviceUpdateFailure.h \ + ./out/RICserviceQuery.h \ + ./out/CauseE2.h \ + ./out/CauseMisc.h \ + ./out/CauseProtocol.h \ + ./out/CauseRIC.h \ + ./out/CauseRICservice.h \ + ./out/CauseTransport.h \ + ./out/CriticalityDiagnosticsE2.h \ + ./out/CriticalityDiagnostics-IE-ListE2.h \ + ./out/CriticalityDiagnostics-IE-ItemE2.h \ + ./out/ENB-ID.h \ + ./out/ENB-ID-Choice.h \ + ./out/ENGNB-ID.h \ + ./out/GlobalE2node-ID.h \ + ./out/GlobalE2node-en-gNB-ID.h \ + ./out/GlobalE2node-eNB-ID.h \ + ./out/GlobalE2node-gNB-ID.h \ + ./out/GlobalE2node-ng-eNB-ID.h \ + ./out/GlobalENB-ID.h \ + ./out/GlobalenGNB-ID.h \ + ./out/GlobalgNB-ID.h \ + ./out/GlobalngeNB-ID.h \ + ./out/GlobalRIC-ID.h \ + ./out/GNB-CU-UP-ID.h \ + ./out/GNB-DU-IDE2.h \ + ./out/GNB-ID-Choice.h \ + ./out/PLMN-IdentityE2.h \ + ./out/RANfunctionDefinition.h \ + ./out/RANfunctionID.h \ + ./out/RANfunctionRevision.h \ + ./out/RICactionDefinition.h \ + ./out/RICactionID.h \ + ./out/RICactionType.h \ + ./out/RICcallProcessID.h \ + ./out/RICcontrolAckRequest.h \ + ./out/RICcontrolHeader.h \ + ./out/RICcontrolMessage.h \ + ./out/RICcontrolOutcome.h \ + ./out/RICcontrolStatus.h \ + ./out/RICeventTriggerDefinition.h \ + ./out/RICindicationHeader.h \ + ./out/RICindicationMessage.h \ + ./out/RICindicationSN.h \ + ./out/RICindicationType.h \ + ./out/RICrequestID.h \ + ./out/RICsubsequentAction.h \ + ./out/RICsubsequentActionType.h \ + ./out/RICtimeToWait.h \ + ./out/TimeToWaitE2.h \ + ./out/TypeOfErrorE2.h \ + ./out/CriticalityE2.h \ + ./out/PresenceE2.h \ + ./out/ProcedureCodeE2.h \ + ./out/ProtocolIE-IDE2.h \ + ./out/TriggeringMessageE2.h \ + ./out/ProtocolIE-ContainerE2.h \ + ./out/ProtocolIE-SingleContainerE2.h \ + ./out/ProtocolIE-FieldE2.h \ + ./out/ProtocolIE-ContainerPairE2.h \ + ./out/ProtocolIE-FieldPairE2.h \ + ./out/ProtocolIE-ContainerList.h \ + ./out/ProtocolIE-ContainerPairList.h + +ASN_MODULE_HDRS+=./out/ANY.h +ASN_MODULE_SRCS+=./out/ANY.c +ASN_MODULE_HDRS+=./out/OCTET_STRING.h +ASN_MODULE_HDRS+=./out/OPEN_TYPE.h +ASN_MODULE_SRCS+=./out/OPEN_TYPE.c +ASN_MODULE_HDRS+=./out/constr_CHOICE.h +ASN_MODULE_HDRS+=./out/INTEGER.h +ASN_MODULE_SRCS+=./out/INTEGER.c +ASN_MODULE_HDRS+=./out/NativeEnumerated.h +ASN_MODULE_SRCS+=./out/NativeEnumerated.c +ASN_MODULE_HDRS+=./out/NativeInteger.h +ASN_MODULE_SRCS+=./out/NativeInteger.c +ASN_MODULE_HDRS+=./out/asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./out/asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./out/asn_SET_OF.h +ASN_MODULE_SRCS+=./out/asn_SET_OF.c +ASN_MODULE_SRCS+=./out/constr_CHOICE.c +ASN_MODULE_HDRS+=./out/constr_SEQUENCE.h +ASN_MODULE_SRCS+=./out/constr_SEQUENCE.c +ASN_MODULE_HDRS+=./out/constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./out/constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./out/constr_SET_OF.h +ASN_MODULE_SRCS+=./out/constr_SET_OF.c +ASN_MODULE_HDRS+=./out/asn_application.h +ASN_MODULE_SRCS+=./out/asn_application.c +ASN_MODULE_HDRS+=./out/asn_ioc.h +ASN_MODULE_HDRS+=./out/asn_system.h +ASN_MODULE_HDRS+=./out/asn_codecs.h +ASN_MODULE_HDRS+=./out/asn_internal.h +ASN_MODULE_SRCS+=./out/asn_internal.c +ASN_MODULE_HDRS+=./out/asn_random_fill.h +ASN_MODULE_SRCS+=./out/asn_random_fill.c +ASN_MODULE_HDRS+=./out/asn_bit_data.h +ASN_MODULE_SRCS+=./out/asn_bit_data.c +ASN_MODULE_SRCS+=./out/OCTET_STRING.c +ASN_MODULE_HDRS+=./out/BIT_STRING.h +ASN_MODULE_SRCS+=./out/BIT_STRING.c +ASN_MODULE_SRCS+=./out/asn_codecs_prim.c +ASN_MODULE_HDRS+=./out/asn_codecs_prim.h +ASN_MODULE_HDRS+=./out/ber_tlv_length.h +ASN_MODULE_SRCS+=./out/ber_tlv_length.c +ASN_MODULE_HDRS+=./out/ber_tlv_tag.h +ASN_MODULE_SRCS+=./out/ber_tlv_tag.c +ASN_MODULE_HDRS+=./out/ber_decoder.h +ASN_MODULE_SRCS+=./out/ber_decoder.c +ASN_MODULE_HDRS+=./out/der_encoder.h +ASN_MODULE_SRCS+=./out/der_encoder.c +ASN_MODULE_HDRS+=./out/constr_TYPE.h +ASN_MODULE_SRCS+=./out/constr_TYPE.c +ASN_MODULE_HDRS+=./out/constraints.h +ASN_MODULE_SRCS+=./out/constraints.c +ASN_MODULE_HDRS+=./out/xer_support.h +ASN_MODULE_SRCS+=./out/xer_support.c +ASN_MODULE_HDRS+=./out/xer_decoder.h +ASN_MODULE_SRCS+=./out/xer_decoder.c +ASN_MODULE_HDRS+=./out/xer_encoder.h +ASN_MODULE_SRCS+=./out/xer_encoder.c +ASN_MODULE_HDRS+=./out/per_support.h +ASN_MODULE_SRCS+=./out/per_support.c +ASN_MODULE_HDRS+=./out/per_decoder.h +ASN_MODULE_SRCS+=./out/per_decoder.c +ASN_MODULE_HDRS+=./out/per_encoder.h +ASN_MODULE_SRCS+=./out/per_encoder.c +ASN_MODULE_HDRS+=./out/per_opentype.h +ASN_MODULE_SRCS+=./out/per_opentype.c +ASN_MODULE_HDRS+=./out/oer_decoder.h +ASN_MODULE_HDRS+=./out/oer_encoder.h +ASN_MODULE_HDRS+=./out/oer_support.h +ASN_MODULE_SRCS+=./out/oer_decoder.c +ASN_MODULE_SRCS+=./out/oer_encoder.c +ASN_MODULE_SRCS+=./out/oer_support.c +ASN_MODULE_SRCS+=./out/OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=./out/INTEGER_oer.c +ASN_MODULE_SRCS+=./out/BIT_STRING_oer.c +ASN_MODULE_SRCS+=./out/OCTET_STRING_oer.c +ASN_MODULE_SRCS+=./out/NativeInteger_oer.c +ASN_MODULE_SRCS+=./out/NativeEnumerated_oer.c +ASN_MODULE_SRCS+=./out/constr_CHOICE_oer.c +ASN_MODULE_SRCS+=./out/constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=./out/constr_SET_OF_oer.c + +ASN_MODULE_CFLAGS= + +lib_LTLIBRARIES+=libasncodec.la +libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/./out/ +libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) +libasncodec_la_LDFLAGS=-lm diff --git a/src/codec_utils/E2AP_MASTER/NativeEnumerated.c b/src/codec_utils/E2AP_MASTER/NativeEnumerated.c new file mode 100644 index 000000000..50ffb1d78 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeEnumerated.c @@ -0,0 +1,367 @@ +/*- + * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeEnumerated basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeEnumerated = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeEnumerated_decode_oer, + NativeEnumerated_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, + NativeEnumerated_decode_aper, + NativeEnumerated_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeEnumerated_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { + "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + "ENUMERATED", + &asn_OP_NativeEnumerated, + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +asn_enc_rval_t +NativeEnumerated_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + const asn_INTEGER_enum_map_t *el; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + el = INTEGER_map_value2enum(specs, *native); + if(el) { + er.encoded = + asn__format_to_callback(cb, app_key, "<%s/>", el->enum_name); + if(er.encoded < 0) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } else { + ASN_DEBUG( + "ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +NativeEnumerated_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +static int +NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { + const asn_INTEGER_enum_map_t *a = ap; + const asn_INTEGER_enum_map_t *b = bp; + if(a->nat_value == b->nat_value) + return 0; + if(a->nat_value < b->nat_value) + return -1; + return 1; +} + +asn_enc_rval_t +NativeEnumerated_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + const asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +NativeEnumerated_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + /* Deal with APER padding */ + if(ct && ct->upper_bound >= 255) { + int padding = 0; + padding = (8 - (pd->moved % 8)) % 8; + ASN_DEBUG("For NativeEnumerated %s,offset= %lu Padding bits = %d", td->name, pd->moved, padding); + ASN_DEBUG("For NativeEnumerated %s, upper bound = %lu", td->name, ct->upper_bound); + if(padding > 0) + per_get_few_bits(pd, padding); + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +asn_enc_rval_t +NativeEnumerated_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + if(native < 0) ASN__ENCODE_FAILED; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/src/codec_utils/E2AP_MASTER/NativeEnumerated.h b/src/codec_utils/E2AP_MASTER/NativeEnumerated.h new file mode 100644 index 000000000..459f0e633 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeEnumerated.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard ENUMERATED in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeEnumerated_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeEnumerated_H_ +#define _NativeEnumerated_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; +extern asn_TYPE_operation_t asn_OP_NativeEnumerated; + +xer_type_encoder_f NativeEnumerated_encode_xer; +oer_type_decoder_f NativeEnumerated_decode_oer; +oer_type_encoder_f NativeEnumerated_encode_oer; +per_type_decoder_f NativeEnumerated_decode_uper; +per_type_encoder_f NativeEnumerated_encode_uper; +per_type_decoder_f NativeEnumerated_decode_aper; +per_type_encoder_f NativeEnumerated_encode_aper; + +#define NativeEnumerated_free NativeInteger_free +#define NativeEnumerated_print NativeInteger_print +#define NativeEnumerated_compare NativeInteger_compare +#define NativeEnumerated_random_fill NativeInteger_random_fill +#define NativeEnumerated_constraint asn_generic_no_constraint +#define NativeEnumerated_decode_ber NativeInteger_decode_ber +#define NativeEnumerated_encode_der NativeInteger_encode_der +#define NativeEnumerated_decode_xer NativeInteger_decode_xer + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeEnumerated_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/NativeEnumerated_oer.c b/src/codec_utils/E2AP_MASTER/NativeEnumerated_oer.c new file mode 100644 index 000000000..ee3c1895e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeEnumerated_oer.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +static long +asn__nativeenumerated_convert(const uint8_t *b, const uint8_t *end) { + unsigned long value; + + /* Perform the sign initialization */ + /* Actually value = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) { + value = (unsigned long)(-1); + } else { + value = 0; + } + + /* Conversion engine */ + for(; b < end; b++) { + value = (value << 8) | *b; + } + + return value; +} + +asn_dec_rval_t +NativeEnumerated_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + const uint8_t *b = ptr; + + (void)opt_codec_ctx; + (void)constraints; + + if(size < 1) { + ASN__DECODE_STARVED; + } + + if((*b & 0x80) == 0) { + /* + * X.696 (08/2015) #11.2 Short form for Enumerated. + */ + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = *b; + rval.consumed = 1; + } else { + /* + * X.696 (08/2015) #11.4 Long form for Enumerated. + */ + size_t length = *b & 0x7f; + const uint8_t *bend; + long value; + + if(length < 1 || length > sizeof(*native)) { + ASN__DECODE_FAILED; + } + if((1 + length) > size) { + ASN__DECODE_STARVED; + } + b++; + bend = b + length; + + value = asn__nativeenumerated_convert(b, bend); + if(value < 0) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + ASN__DECODE_FAILED; + } + } + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = value; + + rval.consumed = (1 + length); + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeEnumerated_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + long native; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + if(native >= 0 && native <= 127) { + /* #11.2 Short form */ + uint8_t b = native; + er.encoded = 1; + if(cb(&b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } else { + /* #11.2 Long form */ + uint8_t buf[1 + sizeof(native)]; + uint8_t *b = &buf[sizeof(native)]; /* Last addressable */ + long final_pattern = -1 * (native < 0); + + for(;;) { + *b-- = native; + native >>= 8; + if(native == final_pattern) { + if(final_pattern) { + if((b[1] & 0x80)) break; + } else { + if(!(b[1] & 0x80)) break; + } + } + } + *b = 0x80 | (&buf[sizeof(native)] - b); + er.encoded = 1 + (&buf[sizeof(native)] - b); + if(cb(b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_MASTER/NativeInteger.c b/src/codec_utils/E2AP_MASTER/NativeInteger.c new file mode 100644 index 000000000..316e8720a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeInteger.c @@ -0,0 +1,550 @@ +/*- + * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeInteger basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeInteger = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeInteger_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeInteger_decode_oer, /* OER decoder */ + NativeInteger_encode_oer, /* Canonical OER encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ + NativeInteger_decode_aper, /* Aligned PER decoder */ + NativeInteger_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeInteger_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeInteger = { + "INTEGER", /* The ASN.1 type is still INTEGER */ + "INTEGER", + &asn_OP_NativeInteger, + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Decode INTEGER type. + */ +asn_dec_rval_t +NativeInteger_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **nint_ptr, + const void *buf_ptr, size_t size, int tag_mode) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + long *native = (long *)*nint_ptr; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(native == NULL) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(native == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded INTEGER: buf_ptr, length + * Fill the native, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + long l; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; + tmp.size = length; + + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *native = l; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", + (long)rval.consumed, (long)length, td->name, (long)*native); + + return rval; +} + +/* + * Encode the NativeInteger using the standard INTEGER type DER encoder. + */ +asn_enc_rval_t +NativeInteger_encode_der(const asn_TYPE_descriptor_t *sd, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned long native = *(const unsigned long *)ptr; /* Disable sign ext. */ + asn_enc_rval_t erval = {0,0,0}; + INTEGER_t tmp; + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + + tmp.buf = (uint8_t *)&native; + tmp.size = sizeof(native); + +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ + uint8_t buf[sizeof(native)]; + uint8_t *p; + + /* Prepare a fake INTEGER */ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) + *p = (uint8_t)native; + + tmp.buf = buf; + tmp.size = sizeof(buf); +#endif /* WORDS_BIGENDIAN */ + + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.structure_ptr == &tmp) { + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +asn_dec_rval_t +NativeInteger_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + INTEGER_t st; + void *st_ptr = (void *)&st; + long *native = (long *)*sptr; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&st, 0, sizeof(st)); + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + opt_mname, buf_ptr, size); + if(rval.code == RC_OK) { + long l; + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&st, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&st, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } else { + *native = l; + } + } else { + /* + * Cannot restart from the middle; + * there is no place to save state in the native type. + * Request a continuation from the very beginning. + */ + rval.consumed = 0; + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); + return rval; +} + + +asn_enc_rval_t +NativeInteger_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; /* Enough for 64-bit int */ + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + er.encoded = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); + if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) + || cb(scratch, er.encoded, app_key) < 0) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +NativeInteger_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_uper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +asn_dec_rval_t +NativeInteger_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (APER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_aper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (APER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, (unsigned long)native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_aper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +/* + * INTEGER specific human-readable output. + */ +int +NativeInteger_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + const long *native = (const long *)sptr; + char scratch[32]; /* Enough for 64-bit int */ + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(native) { + long value = *native; + ret = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) ? "%lu" : "%ld", value); + assert(ret > 0 && (size_t)ret < sizeof(scratch)); + if(cb(scratch, ret, app_key) < 0) return -1; + if(specs && (value >= 0 || !specs->field_unsigned)) { + const asn_INTEGER_enum_map_t *el = + INTEGER_map_value2enum(specs, value); + if(el) { + if(cb(" (", 2, app_key) < 0) return -1; + if(cb(el->enum_name, el->enum_len, app_key) < 0) return -1; + if(cb(")", 1, app_key) < 0) return -1; + } + } + return 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +NativeInteger_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", + td->name, method, ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, sizeof(long)); + break; + } +} + +int +NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + (void)td; + + if(aptr && bptr) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + const unsigned long *a = aptr; + const unsigned long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } else { + const long *a = aptr; + const long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } + } else if(!aptr) { + return -1; + } else { + return 1; + } +} + +asn_random_fill_result_t +NativeInteger_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + long *st = *sptr; + const asn_INTEGER_enum_map_t *emap; + size_t emap_len; + intmax_t value; + int find_inside_map; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (long *)CALLOC(1, sizeof(*st)); + if(st == NULL) { + return result_failed; + } + } + + if(specs) { + emap = specs->value2enum; + emap_len = specs->map_count; + if(specs->strict_enumeration) { + find_inside_map = emap_len > 0; + } else { + find_inside_map = emap_len ? asn_random_between(0, 1) : 0; + } + } else { + emap = 0; + emap_len = 0; + find_inside_map = 0; + } + + if(find_inside_map) { + assert(emap_len > 0); + value = emap[asn_random_between(0, emap_len - 1)].nat_value; + } else { + const asn_per_constraints_t *ct; + + static const long variants[] = { + -65536, -65535, -65534, -32769, -32768, -32767, -16385, -16384, + -16383, -257, -256, -255, -254, -129, -128, -127, + -126, -1, 0, 1, 126, 127, 128, 129, + 254, 255, 256, 257, 16383, 16384, 16385, 32767, + 32768, 32769, 65534, 65535, 65536, 65537}; + if(specs && specs->field_unsigned) { + assert(variants[18] == 0); + value = variants[asn_random_between( + 18, sizeof(variants) / sizeof(variants[0]) - 1)]; + } else { + value = variants[asn_random_between( + 0, sizeof(variants) / sizeof(variants[0]) - 1)]; + } + + if(!constraints) constraints = &td->encoding_constraints; + ct = constraints ? constraints->per_constraints : 0; + if(ct && (ct->value.flags & APC_CONSTRAINED)) { + if(value < ct->value.lower_bound || value > ct->value.upper_bound) { + value = asn_random_between(ct->value.lower_bound, + ct->value.upper_bound); + } + } + } + + *sptr = st; + *st = value; + return result_ok; +} diff --git a/src/codec_utils/E2AP_MASTER/NativeInteger.h b/src/codec_utils/E2AP_MASTER/NativeInteger.h new file mode 100644 index 000000000..c74406a8a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeInteger.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard INTEGER in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeInteger_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeInteger_H_ +#define _NativeInteger_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; +extern asn_TYPE_operation_t asn_OP_NativeInteger; + +asn_struct_free_f NativeInteger_free; +asn_struct_print_f NativeInteger_print; +asn_struct_compare_f NativeInteger_compare; +ber_type_decoder_f NativeInteger_decode_ber; +der_type_encoder_f NativeInteger_encode_der; +xer_type_decoder_f NativeInteger_decode_xer; +xer_type_encoder_f NativeInteger_encode_xer; +oer_type_decoder_f NativeInteger_decode_oer; +oer_type_encoder_f NativeInteger_encode_oer; +per_type_decoder_f NativeInteger_decode_uper; +per_type_encoder_f NativeInteger_encode_uper; +per_type_decoder_f NativeInteger_decode_aper; +per_type_encoder_f NativeInteger_encode_aper; +asn_random_fill_f NativeInteger_random_fill; + +#define NativeInteger_constraint asn_generic_no_constraint + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeInteger_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/NativeInteger_oer.c b/src/codec_utils/E2AP_MASTER/NativeInteger_oer.c new file mode 100644 index 000000000..411413a24 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/NativeInteger_oer.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +NativeInteger_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + INTEGER_t tmpint; + INTEGER_t *tmpintptr = &tmpint; + + memset(&tmpint, 0, sizeof(tmpint)); + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + /* + * OPTIMIZATION: Encode directly rather than passing through INTEGER. + * Saves a memory allocation. + */ + rval = INTEGER_decode_oer(opt_codec_ctx, td, constraints, + (void **)&tmpintptr, ptr, size); + if(rval.code != RC_OK) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return rval; + } + + if(specs && specs->field_unsigned) { + unsigned long ul; + int ok = asn_INTEGER2ulong(&tmpint, &ul) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = ul; + } else { + rval.code = RC_FAIL; + return rval; + } + } else { + long l; + int ok = asn_INTEGER2long(&tmpint, &l) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = l; + } else { + rval.code = RC_FAIL; + return rval; + } + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeInteger_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + INTEGER_t tmpint; + long native; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + memset(&tmpint, 0, sizeof(tmpint)); + + ASN_DEBUG("Encoding %s %ld as NativeInteger", td ? td->name : "", native); + + if((specs && specs->field_unsigned) ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t er = + INTEGER_encode_oer(td, constraints, &tmpint, cb, app_key); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.c b/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.c new file mode 100644 index 000000000..800a2163a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.c @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PLMN-IdentityE2.h" + +int +PLMN_IdentityE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 3)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_PLMN_IdentityE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +asn_per_constraints_t asn_PER_type_PLMN_IdentityE2_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 3, 3 } /* (SIZE(3..3)) */, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_PLMN_IdentityE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_PLMN_IdentityE2 = { + "PLMN-IdentityE2", + "PLMN-IdentityE2", + &asn_OP_OCTET_STRING, + asn_DEF_PLMN_IdentityE2_tags_1, + sizeof(asn_DEF_PLMN_IdentityE2_tags_1) + /sizeof(asn_DEF_PLMN_IdentityE2_tags_1[0]), /* 1 */ + asn_DEF_PLMN_IdentityE2_tags_1, /* Same as above */ + sizeof(asn_DEF_PLMN_IdentityE2_tags_1) + /sizeof(asn_DEF_PLMN_IdentityE2_tags_1[0]), /* 1 */ + { &asn_OER_type_PLMN_IdentityE2_constr_1, &asn_PER_type_PLMN_IdentityE2_constr_1, PLMN_IdentityE2_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.h b/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.h new file mode 100644 index 000000000..44d0cd2c6 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/PLMN-IdentityE2.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PLMN_IdentityE2_H_ +#define _PLMN_IdentityE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PLMN-IdentityE2 */ +typedef OCTET_STRING_t PLMN_IdentityE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_PLMN_IdentityE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_PLMN_IdentityE2; +asn_struct_free_f PLMN_IdentityE2_free; +asn_struct_print_f PLMN_IdentityE2_print; +asn_constr_check_f PLMN_IdentityE2_constraint; +ber_type_decoder_f PLMN_IdentityE2_decode_ber; +der_type_encoder_f PLMN_IdentityE2_encode_der; +xer_type_decoder_f PLMN_IdentityE2_decode_xer; +xer_type_encoder_f PLMN_IdentityE2_encode_xer; +oer_type_decoder_f PLMN_IdentityE2_decode_oer; +oer_type_encoder_f PLMN_IdentityE2_encode_oer; +per_type_decoder_f PLMN_IdentityE2_decode_uper; +per_type_encoder_f PLMN_IdentityE2_encode_uper; +per_type_decoder_f PLMN_IdentityE2_decode_aper; +per_type_encoder_f PLMN_IdentityE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _PLMN_IdentityE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/PresenceE2.c b/src/codec_utils/E2AP_MASTER/PresenceE2.c new file mode 100644 index 000000000..9ce3b2b91 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/PresenceE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PresenceE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_PresenceE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_PresenceE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_PresenceE2_value2enum_1[] = { + { 0, 8, "optional" }, + { 1, 11, "conditional" }, + { 2, 9, "mandatory" } +}; +static const unsigned int asn_MAP_PresenceE2_enum2value_1[] = { + 1, /* conditional(1) */ + 2, /* mandatory(2) */ + 0 /* optional(0) */ +}; +const asn_INTEGER_specifics_t asn_SPC_PresenceE2_specs_1 = { + asn_MAP_PresenceE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_PresenceE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_PresenceE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_PresenceE2 = { + "PresenceE2", + "PresenceE2", + &asn_OP_NativeEnumerated, + asn_DEF_PresenceE2_tags_1, + sizeof(asn_DEF_PresenceE2_tags_1) + /sizeof(asn_DEF_PresenceE2_tags_1[0]), /* 1 */ + asn_DEF_PresenceE2_tags_1, /* Same as above */ + sizeof(asn_DEF_PresenceE2_tags_1) + /sizeof(asn_DEF_PresenceE2_tags_1[0]), /* 1 */ + { &asn_OER_type_PresenceE2_constr_1, &asn_PER_type_PresenceE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_PresenceE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/PresenceE2.h b/src/codec_utils/E2AP_MASTER/PresenceE2.h new file mode 100644 index 000000000..8ab9ca2d6 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/PresenceE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PresenceE2_H_ +#define _PresenceE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum PresenceE2 { + PresenceE2_optional = 0, + PresenceE2_conditional = 1, + PresenceE2_mandatory = 2 +} e_PresenceE2; + +/* PresenceE2 */ +typedef long PresenceE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_PresenceE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_PresenceE2; +extern const asn_INTEGER_specifics_t asn_SPC_PresenceE2_specs_1; +asn_struct_free_f PresenceE2_free; +asn_struct_print_f PresenceE2_print; +asn_constr_check_f PresenceE2_constraint; +ber_type_decoder_f PresenceE2_decode_ber; +der_type_encoder_f PresenceE2_encode_der; +xer_type_decoder_f PresenceE2_decode_xer; +xer_type_encoder_f PresenceE2_encode_xer; +oer_type_decoder_f PresenceE2_decode_oer; +oer_type_encoder_f PresenceE2_encode_oer; +per_type_decoder_f PresenceE2_decode_uper; +per_type_encoder_f PresenceE2_encode_uper; +per_type_decoder_f PresenceE2_decode_aper; +per_type_encoder_f PresenceE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _PresenceE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.c b/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.c new file mode 100644 index 000000000..a9335b871 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProcedureCodeE2.h" + +int +ProcedureCodeE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_ProcedureCodeE2_constr_1 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +asn_per_constraints_t asn_PER_type_ProcedureCodeE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_ProcedureCodeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProcedureCodeE2 = { + "ProcedureCodeE2", + "ProcedureCodeE2", + &asn_OP_NativeInteger, + asn_DEF_ProcedureCodeE2_tags_1, + sizeof(asn_DEF_ProcedureCodeE2_tags_1) + /sizeof(asn_DEF_ProcedureCodeE2_tags_1[0]), /* 1 */ + asn_DEF_ProcedureCodeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ProcedureCodeE2_tags_1) + /sizeof(asn_DEF_ProcedureCodeE2_tags_1[0]), /* 1 */ + { &asn_OER_type_ProcedureCodeE2_constr_1, &asn_PER_type_ProcedureCodeE2_constr_1, ProcedureCodeE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.h b/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.h new file mode 100644 index 000000000..bf85b9ba1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProcedureCodeE2.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProcedureCodeE2_H_ +#define _ProcedureCodeE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProcedureCodeE2 */ +typedef long ProcedureCodeE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_ProcedureCodeE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProcedureCodeE2; +asn_struct_free_f ProcedureCodeE2_free; +asn_struct_print_f ProcedureCodeE2_print; +asn_constr_check_f ProcedureCodeE2_constraint; +ber_type_decoder_f ProcedureCodeE2_decode_ber; +der_type_encoder_f ProcedureCodeE2_encode_der; +xer_type_decoder_f ProcedureCodeE2_decode_xer; +xer_type_encoder_f ProcedureCodeE2_encode_xer; +oer_type_decoder_f ProcedureCodeE2_decode_oer; +oer_type_encoder_f ProcedureCodeE2_encode_oer; +per_type_decoder_f ProcedureCodeE2_decode_uper; +per_type_encoder_f ProcedureCodeE2_encode_uper; +per_type_decoder_f ProcedureCodeE2_decode_aper; +per_type_encoder_f ProcedureCodeE2_encode_aper; +#define ProcedureCodeE2_id_E2setup ((ProcedureCodeE2_t)1) +#define ProcedureCodeE2_id_ErrorIndicationE2 ((ProcedureCodeE2_t)2) +#define ProcedureCodeE2_id_Reset ((ProcedureCodeE2_t)3) +#define ProcedureCodeE2_id_RICcontrol ((ProcedureCodeE2_t)4) +#define ProcedureCodeE2_id_RICindication ((ProcedureCodeE2_t)5) +#define ProcedureCodeE2_id_RICserviceQuery ((ProcedureCodeE2_t)6) +#define ProcedureCodeE2_id_RICserviceUpdate ((ProcedureCodeE2_t)7) +#define ProcedureCodeE2_id_RICsubscription ((ProcedureCodeE2_t)8) +#define ProcedureCodeE2_id_RICsubscriptionDelete ((ProcedureCodeE2_t)9) + +#ifdef __cplusplus +} +#endif + +#endif /* _ProcedureCodeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.c new file mode 100644 index 000000000..3c6446b8d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.c @@ -0,0 +1,870 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerE2.h" + +#include "ProtocolIE-FieldE2.h" +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 = { + sizeof(struct ProtocolIE_ContainerE2_1407P0), + offsetof(struct ProtocolIE_ContainerE2_1407P0, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1, &asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P0_1, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionResponse_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 = { + sizeof(struct ProtocolIE_ContainerE2_1407P1), + offsetof(struct ProtocolIE_ContainerE2_1407P1, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3, &asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P1_3, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 = { + sizeof(struct ProtocolIE_ContainerE2_1407P2), + offsetof(struct ProtocolIE_ContainerE2_1407P2, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5, &asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P2_5, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 = { + sizeof(struct ProtocolIE_ContainerE2_1407P3), + offsetof(struct ProtocolIE_ContainerE2_1407P3, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7, &asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P3_7, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteResponse_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 = { + sizeof(struct ProtocolIE_ContainerE2_1407P4), + offsetof(struct ProtocolIE_ContainerE2_1407P4, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9, &asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P4_9, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 = { + sizeof(struct ProtocolIE_ContainerE2_1407P5), + offsetof(struct ProtocolIE_ContainerE2_1407P5, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11, &asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P5_11, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICindication_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 = { + sizeof(struct ProtocolIE_ContainerE2_1407P6), + offsetof(struct ProtocolIE_ContainerE2_1407P6, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13, &asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P6_13, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 = { + sizeof(struct ProtocolIE_ContainerE2_1407P7), + offsetof(struct ProtocolIE_ContainerE2_1407P7, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15, &asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P7_15, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolAcknowledge_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 = { + sizeof(struct ProtocolIE_ContainerE2_1407P8), + offsetof(struct ProtocolIE_ContainerE2_1407P8, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17, &asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P8_17, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 = { + sizeof(struct ProtocolIE_ContainerE2_1407P9), + offsetof(struct ProtocolIE_ContainerE2_1407P9, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19, &asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P9_19, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ErrorIndicationE2_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 = { + sizeof(struct ProtocolIE_ContainerE2_1407P10), + offsetof(struct ProtocolIE_ContainerE2_1407P10, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21, &asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P10_21, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupRequestIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 = { + sizeof(struct ProtocolIE_ContainerE2_1407P11), + offsetof(struct ProtocolIE_ContainerE2_1407P11, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23, &asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P11_23, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupResponseIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 = { + sizeof(struct ProtocolIE_ContainerE2_1407P12), + offsetof(struct ProtocolIE_ContainerE2_1407P12, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25, &asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P12_25, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupFailureIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 = { + sizeof(struct ProtocolIE_ContainerE2_1407P13), + offsetof(struct ProtocolIE_ContainerE2_1407P13, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27, &asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P13_27, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetRequestIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 = { + sizeof(struct ProtocolIE_ContainerE2_1407P14), + offsetof(struct ProtocolIE_ContainerE2_1407P14, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29, &asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P14_29, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetResponseIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 = { + sizeof(struct ProtocolIE_ContainerE2_1407P15), + offsetof(struct ProtocolIE_ContainerE2_1407P15, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31, &asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P15_31, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdate_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 = { + sizeof(struct ProtocolIE_ContainerE2_1407P16), + offsetof(struct ProtocolIE_ContainerE2_1407P16, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33, &asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P16_33, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateAcknowledge_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 = { + sizeof(struct ProtocolIE_ContainerE2_1407P17), + offsetof(struct ProtocolIE_ContainerE2_1407P17, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35, &asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P17_35, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 = { + sizeof(struct ProtocolIE_ContainerE2_1407P18), + offsetof(struct ProtocolIE_ContainerE2_1407P18, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37, &asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P18_37, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceQuery_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 = { + sizeof(struct ProtocolIE_ContainerE2_1407P19), + offsetof(struct ProtocolIE_ContainerE2_1407P19, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39, &asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P19_39, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.h new file mode 100644 index 000000000..7da7246c9 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerE2.h @@ -0,0 +1,253 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerE2_H_ +#define _ProtocolIE_ContainerE2_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICsubscriptionRequest_IEs; +struct RICsubscriptionResponse_IEs; +struct RICsubscriptionFailure_IEs; +struct RICsubscriptionDeleteRequest_IEs; +struct RICsubscriptionDeleteResponse_IEs; +struct RICsubscriptionDeleteFailure_IEs; +struct RICindication_IEs; +struct RICcontrolRequest_IEs; +struct RICcontrolAcknowledge_IEs; +struct RICcontrolFailure_IEs; +struct ErrorIndicationE2_IEs; +struct E2setupRequestIEs; +struct E2setupResponseIEs; +struct E2setupFailureIEs; +struct ResetRequestIEs; +struct ResetResponseIEs; +struct RICserviceUpdate_IEs; +struct RICserviceUpdateAcknowledge_IEs; +struct RICserviceUpdateFailure_IEs; +struct RICserviceQuery_IEs; + +/* ProtocolIE-ContainerE2 */ +typedef struct ProtocolIE_ContainerE2_1407P0 { + A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P0_t; +typedef struct ProtocolIE_ContainerE2_1407P1 { + A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P1_t; +typedef struct ProtocolIE_ContainerE2_1407P2 { + A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P2_t; +typedef struct ProtocolIE_ContainerE2_1407P3 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P3_t; +typedef struct ProtocolIE_ContainerE2_1407P4 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P4_t; +typedef struct ProtocolIE_ContainerE2_1407P5 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P5_t; +typedef struct ProtocolIE_ContainerE2_1407P6 { + A_SEQUENCE_OF(struct RICindication_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P6_t; +typedef struct ProtocolIE_ContainerE2_1407P7 { + A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P7_t; +typedef struct ProtocolIE_ContainerE2_1407P8 { + A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P8_t; +typedef struct ProtocolIE_ContainerE2_1407P9 { + A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P9_t; +typedef struct ProtocolIE_ContainerE2_1407P10 { + A_SEQUENCE_OF(struct ErrorIndicationE2_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P10_t; +typedef struct ProtocolIE_ContainerE2_1407P11 { + A_SEQUENCE_OF(struct E2setupRequestIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P11_t; +typedef struct ProtocolIE_ContainerE2_1407P12 { + A_SEQUENCE_OF(struct E2setupResponseIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P12_t; +typedef struct ProtocolIE_ContainerE2_1407P13 { + A_SEQUENCE_OF(struct E2setupFailureIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P13_t; +typedef struct ProtocolIE_ContainerE2_1407P14 { + A_SEQUENCE_OF(struct ResetRequestIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P14_t; +typedef struct ProtocolIE_ContainerE2_1407P15 { + A_SEQUENCE_OF(struct ResetResponseIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P15_t; +typedef struct ProtocolIE_ContainerE2_1407P16 { + A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P16_t; +typedef struct ProtocolIE_ContainerE2_1407P17 { + A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P17_t; +typedef struct ProtocolIE_ContainerE2_1407P18 { + A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P18_t; +typedef struct ProtocolIE_ContainerE2_1407P19 { + A_SEQUENCE_OF(struct RICserviceQuery_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P19_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.c new file mode 100644 index 000000000..3b9b894d0 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerList.h" + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.h new file mode 100644 index 000000000..e3aca2bf6 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerList.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerList_H_ +#define _ProtocolIE_ContainerList_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerList_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.c new file mode 100644 index 000000000..ea31cdb45 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerPairE2.h" + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.h new file mode 100644 index 000000000..9157d114d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairE2.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerPairE2_H_ +#define _ProtocolIE_ContainerPairE2_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerPairE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.c new file mode 100644 index 000000000..e43c23120 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerPairList.h" + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.h new file mode 100644 index 000000000..e5aff3e05 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-ContainerPairList.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerPairList_H_ +#define _ProtocolIE_ContainerPairList_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerPairList_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.c new file mode 100644 index 000000000..d287458e1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.c @@ -0,0 +1,7424 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-FieldE2.h" + +static const long asn_VAL_4_id_RICaction_ToBeSetup_Item = 19; +static const long asn_VAL_4_ignore = 1; +static const long asn_VAL_4_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_4_id_RICaction_ToBeSetup_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_ToBeSetup_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_4_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows } +}; +static const long asn_VAL_9_id_RICaction_Admitted_Item = 14; +static const long asn_VAL_9_ignore = 1; +static const long asn_VAL_9_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_Admitted_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_9_id_RICaction_Admitted_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_Admitted_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_9_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_Admitted_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_Admitted_ItemIEs_1_rows } +}; +static const long asn_VAL_10_id_RICaction_NotAdmitted_Item = 16; +static const long asn_VAL_10_ignore = 1; +static const long asn_VAL_10_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_10_id_RICaction_NotAdmitted_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_10_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_10_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows } +}; +static const long asn_VAL_64_id_RANfunction_Item = 8; +static const long asn_VAL_64_ignore = 1; +static const long asn_VAL_64_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunction_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_64_id_RANfunction_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_64_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunction_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_64_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunction_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunction_ItemIEs_1_rows } +}; +static const long asn_VAL_65_id_RANfunctionID_Item = 6; +static const long asn_VAL_65_ignore = 1; +static const long asn_VAL_65_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunctionID_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_65_id_RANfunctionID_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_65_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_65_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunctionID_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunctionID_ItemIEs_1_rows } +}; +static const long asn_VAL_68_id_RANfunctionIEcause_Item = 7; +static const long asn_VAL_68_ignore = 1; +static const long asn_VAL_68_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunctionIDcause_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_68_id_RANfunctionIEcause_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_68_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionIDcause_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_68_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunctionIDcause_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunctionIDcause_ItemIEs_1_rows } +}; +static const long asn_VAL_1_id_RICrequestID = 29; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_1_mandatory = 2; +static const long asn_VAL_2_id_RANfunctionID = 5; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_2_mandatory = 2; +static const long asn_VAL_3_id_RICsubscriptionDetails = 30; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_3_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_1_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_1_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_2_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_2_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_3_id_RICsubscriptionDetails }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&Value", aioc__type, &asn_DEF_RICsubscriptionDetails }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_3_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionRequest_IEs_1[] = { + { 3, 4, asn_IOS_RICsubscriptionRequest_IEs_1_rows } +}; +static const long asn_VAL_5_id_RICrequestID = 29; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_5_mandatory = 2; +static const long asn_VAL_6_id_RANfunctionID = 5; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_6_mandatory = 2; +static const long asn_VAL_7_id_RICactions_Admitted = 17; +static const long asn_VAL_7_reject = 0; +static const long asn_VAL_7_mandatory = 2; +static const long asn_VAL_8_id_RICactions_NotAdmitted = 18; +static const long asn_VAL_8_reject = 0; +static const long asn_VAL_8_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionResponse_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_5_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_5_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_6_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_6_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_7_id_RICactions_Admitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_Admitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_7_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_8_id_RICactions_NotAdmitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_8_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionResponse_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionResponse_IEs_1_rows } +}; +static const long asn_VAL_11_id_RICrequestID = 29; +static const long asn_VAL_11_reject = 0; +static const long asn_VAL_11_mandatory = 2; +static const long asn_VAL_12_id_RANfunctionID = 5; +static const long asn_VAL_12_reject = 0; +static const long asn_VAL_12_mandatory = 2; +static const long asn_VAL_13_id_RICactions_NotAdmitted = 18; +static const long asn_VAL_13_reject = 0; +static const long asn_VAL_13_mandatory = 2; +static const long asn_VAL_14_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_14_ignore = 1; +static const long asn_VAL_14_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_11_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_11_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_11_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_12_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_12_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_12_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_13_id_RICactions_NotAdmitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_13_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_13_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_14_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_14_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_14_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionFailure_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionFailure_IEs_1_rows } +}; +static const long asn_VAL_15_id_RICrequestID = 29; +static const long asn_VAL_15_reject = 0; +static const long asn_VAL_15_mandatory = 2; +static const long asn_VAL_16_id_RANfunctionID = 5; +static const long asn_VAL_16_reject = 0; +static const long asn_VAL_16_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_15_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_15_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_15_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_16_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_16_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_16_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1[] = { + { 2, 4, asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows } +}; +static const long asn_VAL_17_id_RICrequestID = 29; +static const long asn_VAL_17_reject = 0; +static const long asn_VAL_17_mandatory = 2; +static const long asn_VAL_18_id_RANfunctionID = 5; +static const long asn_VAL_18_reject = 0; +static const long asn_VAL_18_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_17_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_17_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_17_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_18_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_18_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_18_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1[] = { + { 2, 4, asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows } +}; +static const long asn_VAL_19_id_RICrequestID = 29; +static const long asn_VAL_19_reject = 0; +static const long asn_VAL_19_mandatory = 2; +static const long asn_VAL_20_id_RANfunctionID = 5; +static const long asn_VAL_20_reject = 0; +static const long asn_VAL_20_mandatory = 2; +static const long asn_VAL_21_id_CauseE2 = 1; +static const long asn_VAL_21_ignore = 1; +static const long asn_VAL_21_mandatory = 2; +static const long asn_VAL_22_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_22_ignore = 1; +static const long asn_VAL_22_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_19_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_19_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_19_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_20_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_20_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_20_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_21_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_21_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_21_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_22_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_22_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_22_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows } +}; +static const long asn_VAL_23_id_RICrequestID = 29; +static const long asn_VAL_23_reject = 0; +static const long asn_VAL_23_mandatory = 2; +static const long asn_VAL_24_id_RANfunctionID = 5; +static const long asn_VAL_24_reject = 0; +static const long asn_VAL_24_mandatory = 2; +static const long asn_VAL_25_id_RICactionID = 15; +static const long asn_VAL_25_reject = 0; +static const long asn_VAL_25_mandatory = 2; +static const long asn_VAL_26_id_RICindicationSN = 27; +static const long asn_VAL_26_reject = 0; +static const long asn_VAL_26_optional = 0; +static const long asn_VAL_27_id_RICindicationType = 28; +static const long asn_VAL_27_reject = 0; +static const long asn_VAL_27_mandatory = 2; +static const long asn_VAL_28_id_RICindicationHeader = 25; +static const long asn_VAL_28_reject = 0; +static const long asn_VAL_28_mandatory = 2; +static const long asn_VAL_29_id_RICindicationMessage = 26; +static const long asn_VAL_29_reject = 0; +static const long asn_VAL_29_mandatory = 2; +static const long asn_VAL_30_id_RICcallProcessID = 20; +static const long asn_VAL_30_reject = 0; +static const long asn_VAL_30_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICindication_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_23_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_23_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_23_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_24_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_24_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_24_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_25_id_RICactionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_25_reject }, + { "&Value", aioc__type, &asn_DEF_RICactionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_25_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_26_id_RICindicationSN }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_26_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationSN }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_26_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_27_id_RICindicationType }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_27_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationType }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_27_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_28_id_RICindicationHeader }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_28_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationHeader }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_28_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_29_id_RICindicationMessage }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_29_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationMessage }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_29_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_30_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_30_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_30_optional } +}; +static const asn_ioc_set_t asn_IOS_RICindication_IEs_1[] = { + { 8, 4, asn_IOS_RICindication_IEs_1_rows } +}; +static const long asn_VAL_31_id_RICrequestID = 29; +static const long asn_VAL_31_reject = 0; +static const long asn_VAL_31_mandatory = 2; +static const long asn_VAL_32_id_RANfunctionID = 5; +static const long asn_VAL_32_reject = 0; +static const long asn_VAL_32_mandatory = 2; +static const long asn_VAL_33_id_RICcallProcessID = 20; +static const long asn_VAL_33_reject = 0; +static const long asn_VAL_33_optional = 0; +static const long asn_VAL_34_id_RICcontrolHeader = 22; +static const long asn_VAL_34_reject = 0; +static const long asn_VAL_34_mandatory = 2; +static const long asn_VAL_35_id_RICcontrolMessage = 23; +static const long asn_VAL_35_reject = 0; +static const long asn_VAL_35_mandatory = 2; +static const long asn_VAL_36_id_RICcontrolAckRequest = 21; +static const long asn_VAL_36_reject = 0; +static const long asn_VAL_36_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_31_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_31_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_31_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_32_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_32_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_32_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_33_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_33_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_33_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_34_id_RICcontrolHeader }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_34_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolHeader }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_34_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_35_id_RICcontrolMessage }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_35_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolMessage }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_35_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_36_id_RICcontrolAckRequest }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_36_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolAckRequest }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_36_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolRequest_IEs_1[] = { + { 6, 4, asn_IOS_RICcontrolRequest_IEs_1_rows } +}; +static const long asn_VAL_37_id_RICrequestID = 29; +static const long asn_VAL_37_reject = 0; +static const long asn_VAL_37_mandatory = 2; +static const long asn_VAL_38_id_RANfunctionID = 5; +static const long asn_VAL_38_reject = 0; +static const long asn_VAL_38_mandatory = 2; +static const long asn_VAL_39_id_RICcallProcessID = 20; +static const long asn_VAL_39_reject = 0; +static const long asn_VAL_39_optional = 0; +static const long asn_VAL_40_id_RICcontrolStatus = 24; +static const long asn_VAL_40_reject = 0; +static const long asn_VAL_40_mandatory = 2; +static const long asn_VAL_41_id_RICcontrolOutcome = 32; +static const long asn_VAL_41_reject = 0; +static const long asn_VAL_41_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolAcknowledge_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_37_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_37_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_37_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_38_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_38_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_38_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_39_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_39_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_39_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_40_id_RICcontrolStatus }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_40_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolStatus }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_40_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_41_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_41_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_41_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolAcknowledge_IEs_1[] = { + { 5, 4, asn_IOS_RICcontrolAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_42_id_RICrequestID = 29; +static const long asn_VAL_42_reject = 0; +static const long asn_VAL_42_mandatory = 2; +static const long asn_VAL_43_id_RANfunctionID = 5; +static const long asn_VAL_43_reject = 0; +static const long asn_VAL_43_mandatory = 2; +static const long asn_VAL_44_id_RICcallProcessID = 20; +static const long asn_VAL_44_reject = 0; +static const long asn_VAL_44_optional = 0; +static const long asn_VAL_45_id_CauseE2 = 1; +static const long asn_VAL_45_ignore = 1; +static const long asn_VAL_45_mandatory = 2; +static const long asn_VAL_46_id_RICcontrolOutcome = 32; +static const long asn_VAL_46_reject = 0; +static const long asn_VAL_46_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_42_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_42_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_42_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_43_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_43_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_43_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_44_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_44_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_44_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_45_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_45_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_45_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_46_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_46_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_46_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolFailure_IEs_1[] = { + { 5, 4, asn_IOS_RICcontrolFailure_IEs_1_rows } +}; +static const long asn_VAL_47_id_RICrequestID = 29; +static const long asn_VAL_47_reject = 0; +static const long asn_VAL_47_optional = 0; +static const long asn_VAL_48_id_RANfunctionID = 5; +static const long asn_VAL_48_reject = 0; +static const long asn_VAL_48_optional = 0; +static const long asn_VAL_49_id_CauseE2 = 1; +static const long asn_VAL_49_ignore = 1; +static const long asn_VAL_49_optional = 0; +static const long asn_VAL_50_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_50_ignore = 1; +static const long asn_VAL_50_optional = 0; +static const asn_ioc_cell_t asn_IOS_ErrorIndicationE2_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_47_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_47_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_47_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_48_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_48_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_48_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_49_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_49_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_49_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_50_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_50_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_50_optional } +}; +static const asn_ioc_set_t asn_IOS_ErrorIndicationE2_IEs_1[] = { + { 4, 4, asn_IOS_ErrorIndicationE2_IEs_1_rows } +}; +static const long asn_VAL_51_id_GlobalE2node_ID = 3; +static const long asn_VAL_51_reject = 0; +static const long asn_VAL_51_mandatory = 2; +static const long asn_VAL_52_id_RANfunctionsAdded = 10; +static const long asn_VAL_52_reject = 0; +static const long asn_VAL_52_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupRequestIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_51_id_GlobalE2node_ID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_51_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalE2node_ID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_51_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_52_id_RANfunctionsAdded }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_52_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_52_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupRequestIEs_1[] = { + { 2, 4, asn_IOS_E2setupRequestIEs_1_rows } +}; +static const long asn_VAL_53_id_GlobalRIC_ID = 4; +static const long asn_VAL_53_reject = 0; +static const long asn_VAL_53_mandatory = 2; +static const long asn_VAL_54_id_RANfunctionsAccepted = 9; +static const long asn_VAL_54_reject = 0; +static const long asn_VAL_54_optional = 0; +static const long asn_VAL_55_id_RANfunctionsRejected = 13; +static const long asn_VAL_55_reject = 0; +static const long asn_VAL_55_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupResponseIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_53_id_GlobalRIC_ID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_53_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalRIC_ID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_53_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_54_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_54_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_54_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_55_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_55_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_55_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupResponseIEs_1[] = { + { 3, 4, asn_IOS_E2setupResponseIEs_1_rows } +}; +static const long asn_VAL_56_id_CauseE2 = 1; +static const long asn_VAL_56_ignore = 1; +static const long asn_VAL_56_mandatory = 2; +static const long asn_VAL_57_id_TimeToWaitE2 = 31; +static const long asn_VAL_57_ignore = 1; +static const long asn_VAL_57_optional = 0; +static const long asn_VAL_58_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_58_ignore = 1; +static const long asn_VAL_58_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupFailureIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_56_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_56_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_56_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_57_id_TimeToWaitE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_57_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWaitE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_57_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_58_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_58_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_58_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupFailureIEs_1[] = { + { 3, 4, asn_IOS_E2setupFailureIEs_1_rows } +}; +static const long asn_VAL_59_id_CauseE2 = 1; +static const long asn_VAL_59_ignore = 1; +static const long asn_VAL_59_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_ResetRequestIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_59_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_59_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_59_mandatory } +}; +static const asn_ioc_set_t asn_IOS_ResetRequestIEs_1[] = { + { 1, 4, asn_IOS_ResetRequestIEs_1_rows } +}; +static const long asn_VAL_60_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_60_ignore = 1; +static const long asn_VAL_60_optional = 0; +static const asn_ioc_cell_t asn_IOS_ResetResponseIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_60_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_60_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_60_optional } +}; +static const asn_ioc_set_t asn_IOS_ResetResponseIEs_1[] = { + { 1, 4, asn_IOS_ResetResponseIEs_1_rows } +}; +static const long asn_VAL_61_id_RANfunctionsAdded = 10; +static const long asn_VAL_61_reject = 0; +static const long asn_VAL_61_optional = 0; +static const long asn_VAL_62_id_RANfunctionsModified = 12; +static const long asn_VAL_62_reject = 0; +static const long asn_VAL_62_optional = 0; +static const long asn_VAL_63_id_RANfunctionsDeleted = 11; +static const long asn_VAL_63_reject = 0; +static const long asn_VAL_63_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdate_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_61_id_RANfunctionsAdded }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_61_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_61_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_62_id_RANfunctionsModified }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_62_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_62_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_63_id_RANfunctionsDeleted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_63_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_63_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdate_IEs_1[] = { + { 3, 4, asn_IOS_RICserviceUpdate_IEs_1_rows } +}; +static const long asn_VAL_66_id_RANfunctionsAccepted = 9; +static const long asn_VAL_66_reject = 0; +static const long asn_VAL_66_optional = 0; +static const long asn_VAL_67_id_RANfunctionsRejected = 13; +static const long asn_VAL_67_reject = 0; +static const long asn_VAL_67_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_66_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_66_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_66_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_67_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_67_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_67_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1[] = { + { 2, 4, asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_69_id_RANfunctionsRejected = 13; +static const long asn_VAL_69_ignore = 1; +static const long asn_VAL_69_optional = 0; +static const long asn_VAL_70_id_TimeToWaitE2 = 31; +static const long asn_VAL_70_ignore = 1; +static const long asn_VAL_70_optional = 0; +static const long asn_VAL_71_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_71_ignore = 1; +static const long asn_VAL_71_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdateFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_69_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_69_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_69_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_70_id_TimeToWaitE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_70_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWaitE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_70_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_71_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_71_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_71_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdateFailure_IEs_1[] = { + { 3, 4, asn_IOS_RICserviceUpdateFailure_IEs_1_rows } +}; +static const long asn_VAL_72_id_RANfunctionsAccepted = 9; +static const long asn_VAL_72_reject = 0; +static const long asn_VAL_72_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceQuery_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_72_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_72_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_72_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceQuery_IEs_1[] = { + { 1, 4, asn_IOS_RICserviceQuery_IEs_1_rows } +}; +static int +memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_ToBeSetup_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_ToBeSetup_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_Admitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_Admitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_NotAdmitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_NotAdmitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunction_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunction_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunctionID_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunctionID_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunctionIDcause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunctionIDcause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICindication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICindication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ErrorIndicationE2_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ErrorIndicationE2_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndicationE2_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ErrorIndicationE2_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ErrorIndicationE2_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndicationE2_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupFailureIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupFailureIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ResetRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ResetRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ResetResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ResetResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceQuery_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceQuery_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_id_constr_2 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_6 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_7 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_8 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_8 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_10 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_12 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_12 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_14 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_16 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_16 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_18 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_20 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_20 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_22 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_23 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_24 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_24 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_26 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_27 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_28 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_28 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_30 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_31 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_32 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_32 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_34 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_36 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_36 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_38 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_39 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_40 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_40 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_42 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_43 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_44 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_44 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_46 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_47 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_48 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_48 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_50 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_51 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_52 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_52 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_54 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_55 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_56 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_56 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_58 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_59 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_60 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_60 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_62 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_63 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_64 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_64 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_66 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_67 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_68 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_68 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_70 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_71 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_72 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_72 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_74 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_75 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_76 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_76 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_78 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_79 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_80 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_80 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_82 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_83 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_84 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_84 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_86 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_87 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_88 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_88 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_90 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_91 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_92 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_92 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_94 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_95 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_96 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_96 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_98 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_99 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_100 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_100 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_102 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_103 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_104 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_104 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs__value, choice.RICaction_ToBeSetup_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_ToBeSetup_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-ToBeSetup-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-ToBeSetup-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct RICaction_ToBeSetup_ItemIEs__value), + offsetof(struct RICaction_ToBeSetup_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_ToBeSetup_ItemIEs__value, present), + sizeof(((struct RICaction_ToBeSetup_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_4, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 1, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_2, &asn_PER_memb_id_constr_2, memb_id_constraint_1 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_ToBeSetup_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_RICaction_ToBeSetup_ItemIEs_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 = { + sizeof(struct RICaction_ToBeSetup_ItemIEs), + offsetof(struct RICaction_ToBeSetup_ItemIEs, _asn_ctx), + asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs = { + "RICaction-ToBeSetup-ItemIEs", + "RICaction-ToBeSetup-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1, + sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */ + asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_ItemIEs_1, + 3, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_8[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs__value, choice.RICaction_Admitted_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_Admitted_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-Admitted-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_8[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-Admitted-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_8 = { + sizeof(struct RICaction_Admitted_ItemIEs__value), + offsetof(struct RICaction_Admitted_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_Admitted_ItemIEs__value, present), + sizeof(((struct RICaction_Admitted_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_8, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_8 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_8, + 1, /* Elements count */ + &asn_SPC_value_specs_8 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_6, &asn_PER_memb_id_constr_6, memb_id_constraint_5 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_Admitted_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_7, &asn_PER_memb_criticality_constr_7, memb_criticality_constraint_5 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_8, + select_RICaction_Admitted_ItemIEs_value_type, + { &asn_OER_memb_value_constr_8, &asn_PER_memb_value_constr_8, memb_value_constraint_5 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_ItemIEs_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5 = { + sizeof(struct RICaction_Admitted_ItemIEs), + offsetof(struct RICaction_Admitted_ItemIEs, _asn_ctx), + asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs = { + "RICaction-Admitted-ItemIEs", + "RICaction-Admitted-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_Admitted_ItemIEs_tags_5, + sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5) + /sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */ + asn_DEF_RICaction_Admitted_ItemIEs_tags_5, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5) + /sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_ItemIEs_5, + 3, /* Elements count */ + &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_12[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs__value, choice.RICaction_NotAdmitted_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_12[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-NotAdmitted-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_12 = { + sizeof(struct RICaction_NotAdmitted_ItemIEs__value), + offsetof(struct RICaction_NotAdmitted_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_NotAdmitted_ItemIEs__value, present), + sizeof(((struct RICaction_NotAdmitted_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_12, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_12 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_12, + 1, /* Elements count */ + &asn_SPC_value_specs_12 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_10, &asn_PER_memb_id_constr_10, memb_id_constraint_9 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_NotAdmitted_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_11, &asn_PER_memb_criticality_constr_11, memb_criticality_constraint_9 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_12, + select_RICaction_NotAdmitted_ItemIEs_value_type, + { &asn_OER_memb_value_constr_12, &asn_PER_memb_value_constr_12, memb_value_constraint_9 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 = { + sizeof(struct RICaction_NotAdmitted_ItemIEs), + offsetof(struct RICaction_NotAdmitted_ItemIEs, _asn_ctx), + asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs = { + "RICaction-NotAdmitted-ItemIEs", + "RICaction-NotAdmitted-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9, + sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9) + /sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9) + /sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_ItemIEs_9, + 3, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_16[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunction_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunction-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_16 = { + sizeof(struct RANfunction_ItemIEs__value), + offsetof(struct RANfunction_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunction_ItemIEs__value, present), + sizeof(((struct RANfunction_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_16, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_16 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_16, + 1, /* Elements count */ + &asn_SPC_value_specs_16 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_14, &asn_PER_memb_id_constr_14, memb_id_constraint_13 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunction_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_15, &asn_PER_memb_criticality_constr_15, memb_criticality_constraint_13 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_16, + select_RANfunction_ItemIEs_value_type, + { &asn_OER_memb_value_constr_16, &asn_PER_memb_value_constr_16, memb_value_constraint_13 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_13[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13 = { + sizeof(struct RANfunction_ItemIEs), + offsetof(struct RANfunction_ItemIEs, _asn_ctx), + asn_MAP_RANfunction_ItemIEs_tag2el_13, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs = { + "RANfunction-ItemIEs", + "RANfunction-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_ItemIEs_tags_13, + sizeof(asn_DEF_RANfunction_ItemIEs_tags_13) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */ + asn_DEF_RANfunction_ItemIEs_tags_13, /* Same as above */ + sizeof(asn_DEF_RANfunction_ItemIEs_tags_13) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_20[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionID_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_20 = { + sizeof(struct RANfunctionID_ItemIEs__value), + offsetof(struct RANfunctionID_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunctionID_ItemIEs__value, present), + sizeof(((struct RANfunctionID_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_20, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_20 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_20, + 1, /* Elements count */ + &asn_SPC_value_specs_20 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_18, &asn_PER_memb_id_constr_18, memb_id_constraint_17 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunctionID_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_19, &asn_PER_memb_criticality_constr_19, memb_criticality_constraint_17 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_20, + select_RANfunctionID_ItemIEs_value_type, + { &asn_OER_memb_value_constr_20, &asn_PER_memb_value_constr_20, memb_value_constraint_17 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_17[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_17[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17 = { + sizeof(struct RANfunctionID_ItemIEs), + offsetof(struct RANfunctionID_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionID_ItemIEs_tag2el_17, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs = { + "RANfunctionID-ItemIEs", + "RANfunctionID-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionID_ItemIEs_tags_17, + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */ + asn_DEF_RANfunctionID_ItemIEs_tags_17, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_24[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionIDcause_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionIDcause-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_24[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionIDcause-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_24 = { + sizeof(struct RANfunctionIDcause_ItemIEs__value), + offsetof(struct RANfunctionIDcause_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunctionIDcause_ItemIEs__value, present), + sizeof(((struct RANfunctionIDcause_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_24, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_24 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_24, + 1, /* Elements count */ + &asn_SPC_value_specs_24 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_22, &asn_PER_memb_id_constr_22, memb_id_constraint_21 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunctionIDcause_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_23, &asn_PER_memb_criticality_constr_23, memb_criticality_constraint_21 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_24, + select_RANfunctionIDcause_ItemIEs_value_type, + { &asn_OER_memb_value_constr_24, &asn_PER_memb_value_constr_24, memb_value_constraint_21 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 = { + sizeof(struct RANfunctionIDcause_ItemIEs), + offsetof(struct RANfunctionIDcause_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs = { + "RANfunctionIDcause-ItemIEs", + "RANfunctionIDcause-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionIDcause_ItemIEs_tags_21, + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */ + asn_DEF_RANfunctionIDcause_ItemIEs_tags_21, /* Same as above */ + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_28[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICsubscriptionDetails), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDetails, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDetails" + }, +}; +static const unsigned asn_MAP_value_to_canonical_28[] = { 1, 0, 2 }; +static const unsigned asn_MAP_value_from_canonical_28[] = { 1, 0, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_28[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* RICsubscriptionDetails */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_28 = { + sizeof(struct RICsubscriptionRequest_IEs__value), + offsetof(struct RICsubscriptionRequest_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionRequest_IEs__value, present), + sizeof(((struct RICsubscriptionRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_28, + 3, /* Count of tags in the map */ + asn_MAP_value_to_canonical_28, + asn_MAP_value_from_canonical_28, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_28 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_28, + 3, /* Elements count */ + &asn_SPC_value_specs_28 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_26, &asn_PER_memb_id_constr_26, memb_id_constraint_25 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_27, &asn_PER_memb_criticality_constr_27, memb_criticality_constraint_25 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_28, + select_RICsubscriptionRequest_IEs_value_type, + { &asn_OER_memb_value_constr_28, &asn_PER_memb_value_constr_28, memb_value_constraint_25 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_25[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_25[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25 = { + sizeof(struct RICsubscriptionRequest_IEs), + offsetof(struct RICsubscriptionRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionRequest_IEs_tag2el_25, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs = { + "RICsubscriptionRequest-IEs", + "RICsubscriptionRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionRequest_IEs_tags_25, + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */ + asn_DEF_RICsubscriptionRequest_IEs_tags_25, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionRequest_IEs_25, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionRequest_IEs_specs_25 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_32[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_Admitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_Admitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-Admitted-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_NotAdmitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-List" + }, +}; +static const unsigned asn_MAP_value_to_canonical_32[] = { 1, 0, 2, 3 }; +static const unsigned asn_MAP_value_from_canonical_32[] = { 1, 0, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_32[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-Admitted-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* RICaction-NotAdmitted-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_32 = { + sizeof(struct RICsubscriptionResponse_IEs__value), + offsetof(struct RICsubscriptionResponse_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionResponse_IEs__value, present), + sizeof(((struct RICsubscriptionResponse_IEs__value *)0)->present), + asn_MAP_value_tag2el_32, + 4, /* Count of tags in the map */ + asn_MAP_value_to_canonical_32, + asn_MAP_value_from_canonical_32, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_32 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_32, + 4, /* Elements count */ + &asn_SPC_value_specs_32 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_30, &asn_PER_memb_id_constr_30, memb_id_constraint_29 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionResponse_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_31, &asn_PER_memb_criticality_constr_31, memb_criticality_constraint_29 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_32, + select_RICsubscriptionResponse_IEs_value_type, + { &asn_OER_memb_value_constr_32, &asn_PER_memb_value_constr_32, memb_value_constraint_29 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_29[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29 = { + sizeof(struct RICsubscriptionResponse_IEs), + offsetof(struct RICsubscriptionResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionResponse_IEs_tag2el_29, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs = { + "RICsubscriptionResponse-IEs", + "RICsubscriptionResponse-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionResponse_IEs_tags_29, + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */ + asn_DEF_RICsubscriptionResponse_IEs_tags_29, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionResponse_IEs_29, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionResponse_IEs_specs_29 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_36[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICaction_NotAdmitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_36[] = { 1, 0, 2, 3 }; +static const unsigned asn_MAP_value_from_canonical_36[] = { 1, 0, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_36[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-NotAdmitted-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_36 = { + sizeof(struct RICsubscriptionFailure_IEs__value), + offsetof(struct RICsubscriptionFailure_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionFailure_IEs__value, present), + sizeof(((struct RICsubscriptionFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_36, + 4, /* Count of tags in the map */ + asn_MAP_value_to_canonical_36, + asn_MAP_value_from_canonical_36, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_36 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_36, + 4, /* Elements count */ + &asn_SPC_value_specs_36 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_34, &asn_PER_memb_id_constr_34, memb_id_constraint_33 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_35, &asn_PER_memb_criticality_constr_35, memb_criticality_constraint_33 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_36, + select_RICsubscriptionFailure_IEs_value_type, + { &asn_OER_memb_value_constr_36, &asn_PER_memb_value_constr_36, memb_value_constraint_33 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_33[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33 = { + sizeof(struct RICsubscriptionFailure_IEs), + offsetof(struct RICsubscriptionFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionFailure_IEs_tag2el_33, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs = { + "RICsubscriptionFailure-IEs", + "RICsubscriptionFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionFailure_IEs_tags_33, + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */ + asn_DEF_RICsubscriptionFailure_IEs_tags_33, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionFailure_IEs_33, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionFailure_IEs_specs_33 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_40[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_40[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_40[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_40[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_40 = { + sizeof(struct RICsubscriptionDeleteRequest_IEs__value), + offsetof(struct RICsubscriptionDeleteRequest_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteRequest_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_40, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_40, + asn_MAP_value_from_canonical_40, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_40 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_40, + 2, /* Elements count */ + &asn_SPC_value_specs_40 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_38, &asn_PER_memb_id_constr_38, memb_id_constraint_37 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_39, &asn_PER_memb_criticality_constr_39, memb_criticality_constraint_37 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_40, + select_RICsubscriptionDeleteRequest_IEs_value_type, + { &asn_OER_memb_value_constr_40, &asn_PER_memb_value_constr_40, memb_value_constraint_37 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 = { + sizeof(struct RICsubscriptionDeleteRequest_IEs), + offsetof(struct RICsubscriptionDeleteRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs = { + "RICsubscriptionDeleteRequest-IEs", + "RICsubscriptionDeleteRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37, + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteRequest_IEs_37, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_44[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_44[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_44[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_44[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_44 = { + sizeof(struct RICsubscriptionDeleteResponse_IEs__value), + offsetof(struct RICsubscriptionDeleteResponse_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteResponse_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteResponse_IEs__value *)0)->present), + asn_MAP_value_tag2el_44, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_44, + asn_MAP_value_from_canonical_44, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_44 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_44, + 2, /* Elements count */ + &asn_SPC_value_specs_44 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_42, &asn_PER_memb_id_constr_42, memb_id_constraint_41 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteResponse_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_43, &asn_PER_memb_criticality_constr_43, memb_criticality_constraint_41 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_44, + select_RICsubscriptionDeleteResponse_IEs_value_type, + { &asn_OER_memb_value_constr_44, &asn_PER_memb_value_constr_44, memb_value_constraint_41 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 = { + sizeof(struct RICsubscriptionDeleteResponse_IEs), + offsetof(struct RICsubscriptionDeleteResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs = { + "RICsubscriptionDeleteResponse-IEs", + "RICsubscriptionDeleteResponse-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41, + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteResponse_IEs_41, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_48[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_48[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_48[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_48[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_48 = { + sizeof(struct RICsubscriptionDeleteFailure_IEs__value), + offsetof(struct RICsubscriptionDeleteFailure_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteFailure_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_48, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_48, + asn_MAP_value_from_canonical_48, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_48 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_48, + 4, /* Elements count */ + &asn_SPC_value_specs_48 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_46, &asn_PER_memb_id_constr_46, memb_id_constraint_45 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_47, &asn_PER_memb_criticality_constr_47, memb_criticality_constraint_45 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_48, + select_RICsubscriptionDeleteFailure_IEs_value_type, + { &asn_OER_memb_value_constr_48, &asn_PER_memb_value_constr_48, memb_value_constraint_45 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 = { + sizeof(struct RICsubscriptionDeleteFailure_IEs), + offsetof(struct RICsubscriptionDeleteFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs = { + "RICsubscriptionDeleteFailure-IEs", + "RICsubscriptionDeleteFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45, + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteFailure_IEs_45, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_52[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RICindicationSN, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationSN" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationType), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICindicationType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationType" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationHeader), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICindicationHeader, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationHeader" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationMessage), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICindicationMessage, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationMessage" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_52[] = { 1, 2, 3, 5, 6, 7, 4, 0 }; +static const unsigned asn_MAP_value_from_canonical_52[] = { 7, 0, 1, 2, 6, 3, 4, 5 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_52[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 2 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* RICactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, -2, 0 }, /* RICindicationSN */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 5, 0, 2 }, /* RICindicationHeader */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 6, -1, 1 }, /* RICindicationMessage */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 7, -2, 0 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* RICindicationType */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_52 = { + sizeof(struct RICindication_IEs__value), + offsetof(struct RICindication_IEs__value, _asn_ctx), + offsetof(struct RICindication_IEs__value, present), + sizeof(((struct RICindication_IEs__value *)0)->present), + asn_MAP_value_tag2el_52, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_52, + asn_MAP_value_from_canonical_52, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_52 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_52, + 8, /* Elements count */ + &asn_SPC_value_specs_52 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICindication_IEs_49[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_50, &asn_PER_memb_id_constr_50, memb_id_constraint_49 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICindication_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_51, &asn_PER_memb_criticality_constr_51, memb_criticality_constraint_49 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_52, + select_RICindication_IEs_value_type, + { &asn_OER_memb_value_constr_52, &asn_PER_memb_value_constr_52, memb_value_constraint_49 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_49[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_49[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49 = { + sizeof(struct RICindication_IEs), + offsetof(struct RICindication_IEs, _asn_ctx), + asn_MAP_RICindication_IEs_tag2el_49, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICindication_IEs = { + "RICindication-IEs", + "RICindication-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICindication_IEs_tags_49, + sizeof(asn_DEF_RICindication_IEs_tags_49) + /sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */ + asn_DEF_RICindication_IEs_tags_49, /* Same as above */ + sizeof(asn_DEF_RICindication_IEs_tags_49) + /sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICindication_IEs_49, + 3, /* Elements count */ + &asn_SPC_RICindication_IEs_specs_49 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_56[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolHeader, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolHeader" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolMessage, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolMessage" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolAckRequest), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICcontrolAckRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolAckRequest" + }, +}; +static const unsigned asn_MAP_value_to_canonical_56[] = { 1, 2, 3, 4, 5, 0 }; +static const unsigned asn_MAP_value_from_canonical_56[] = { 5, 0, 1, 2, 3, 4 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_56[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 2 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, -1, 1 }, /* RICcontrolHeader */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -2, 0 }, /* RICcontrolMessage */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 5, 0, 0 }, /* RICcontrolAckRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_56 = { + sizeof(struct RICcontrolRequest_IEs__value), + offsetof(struct RICcontrolRequest_IEs__value, _asn_ctx), + offsetof(struct RICcontrolRequest_IEs__value, present), + sizeof(((struct RICcontrolRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_56, + 6, /* Count of tags in the map */ + asn_MAP_value_to_canonical_56, + asn_MAP_value_from_canonical_56, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_56 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_56, + 6, /* Elements count */ + &asn_SPC_value_specs_56 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_54, &asn_PER_memb_id_constr_54, memb_id_constraint_53 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_55, &asn_PER_memb_criticality_constr_55, memb_criticality_constraint_53 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_56, + select_RICcontrolRequest_IEs_value_type, + { &asn_OER_memb_value_constr_56, &asn_PER_memb_value_constr_56, memb_value_constraint_53 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_53[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_53[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53 = { + sizeof(struct RICcontrolRequest_IEs), + offsetof(struct RICcontrolRequest_IEs, _asn_ctx), + asn_MAP_RICcontrolRequest_IEs_tag2el_53, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs = { + "RICcontrolRequest-IEs", + "RICcontrolRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolRequest_IEs_tags_53, + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */ + asn_DEF_RICcontrolRequest_IEs_tags_53, /* Same as above */ + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolRequest_IEs_53, + 3, /* Elements count */ + &asn_SPC_RICcontrolRequest_IEs_specs_53 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_60[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolStatus), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICcontrolStatus, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolStatus" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolOutcome, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolOutcome" + }, +}; +static const unsigned asn_MAP_value_to_canonical_60[] = { 1, 2, 4, 3, 0 }; +static const unsigned asn_MAP_value_from_canonical_60[] = { 4, 0, 1, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_60[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, 0, 0 }, /* RICcontrolStatus */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_60 = { + sizeof(struct RICcontrolAcknowledge_IEs__value), + offsetof(struct RICcontrolAcknowledge_IEs__value, _asn_ctx), + offsetof(struct RICcontrolAcknowledge_IEs__value, present), + sizeof(((struct RICcontrolAcknowledge_IEs__value *)0)->present), + asn_MAP_value_tag2el_60, + 5, /* Count of tags in the map */ + asn_MAP_value_to_canonical_60, + asn_MAP_value_from_canonical_60, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_60 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_60, + 5, /* Elements count */ + &asn_SPC_value_specs_60 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_58, &asn_PER_memb_id_constr_58, memb_id_constraint_57 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolAcknowledge_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_59, &asn_PER_memb_criticality_constr_59, memb_criticality_constraint_57 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_60, + select_RICcontrolAcknowledge_IEs_value_type, + { &asn_OER_memb_value_constr_60, &asn_PER_memb_value_constr_60, memb_value_constraint_57 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_57[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57 = { + sizeof(struct RICcontrolAcknowledge_IEs), + offsetof(struct RICcontrolAcknowledge_IEs, _asn_ctx), + asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs = { + "RICcontrolAcknowledge-IEs", + "RICcontrolAcknowledge-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolAcknowledge_IEs_tags_57, + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */ + asn_DEF_RICcontrolAcknowledge_IEs_tags_57, /* Same as above */ + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolAcknowledge_IEs_57, + 3, /* Elements count */ + &asn_SPC_RICcontrolAcknowledge_IEs_specs_57 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_64[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolOutcome, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolOutcome" + }, +}; +static const unsigned asn_MAP_value_to_canonical_64[] = { 1, 2, 4, 0, 3 }; +static const unsigned asn_MAP_value_from_canonical_64[] = { 3, 0, 1, 4, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_64[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* RICrequestID */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_64 = { + sizeof(struct RICcontrolFailure_IEs__value), + offsetof(struct RICcontrolFailure_IEs__value, _asn_ctx), + offsetof(struct RICcontrolFailure_IEs__value, present), + sizeof(((struct RICcontrolFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_64, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_64, + asn_MAP_value_from_canonical_64, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_64 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_64, + 5, /* Elements count */ + &asn_SPC_value_specs_64 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_62, &asn_PER_memb_id_constr_62, memb_id_constraint_61 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_63, &asn_PER_memb_criticality_constr_63, memb_criticality_constraint_61 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_64, + select_RICcontrolFailure_IEs_value_type, + { &asn_OER_memb_value_constr_64, &asn_PER_memb_value_constr_64, memb_value_constraint_61 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_61[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_61[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61 = { + sizeof(struct RICcontrolFailure_IEs), + offsetof(struct RICcontrolFailure_IEs, _asn_ctx), + asn_MAP_RICcontrolFailure_IEs_tag2el_61, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs = { + "RICcontrolFailure-IEs", + "RICcontrolFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolFailure_IEs_tags_61, + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */ + asn_DEF_RICcontrolFailure_IEs_tags_61, /* Same as above */ + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolFailure_IEs_61, + 3, /* Elements count */ + &asn_SPC_RICcontrolFailure_IEs_specs_61 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_68[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_68[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_68[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_68[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_68 = { + sizeof(struct ErrorIndicationE2_IEs__value), + offsetof(struct ErrorIndicationE2_IEs__value, _asn_ctx), + offsetof(struct ErrorIndicationE2_IEs__value, present), + sizeof(((struct ErrorIndicationE2_IEs__value *)0)->present), + asn_MAP_value_tag2el_68, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_68, + asn_MAP_value_from_canonical_68, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_68 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_68, + 4, /* Elements count */ + &asn_SPC_value_specs_68 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ErrorIndicationE2_IEs_65[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_66, &asn_PER_memb_id_constr_66, memb_id_constraint_65 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ErrorIndicationE2_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_67, &asn_PER_memb_criticality_constr_67, memb_criticality_constraint_65 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_68, + select_ErrorIndicationE2_IEs_value_type, + { &asn_OER_memb_value_constr_68, &asn_PER_memb_value_constr_68, memb_value_constraint_65 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ErrorIndicationE2_IEs_tags_65[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ErrorIndicationE2_IEs_tag2el_65[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_IEs_specs_65 = { + sizeof(struct ErrorIndicationE2_IEs), + offsetof(struct ErrorIndicationE2_IEs, _asn_ctx), + asn_MAP_ErrorIndicationE2_IEs_tag2el_65, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2_IEs = { + "ErrorIndicationE2-IEs", + "ErrorIndicationE2-IEs", + &asn_OP_SEQUENCE, + asn_DEF_ErrorIndicationE2_IEs_tags_65, + sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65) + /sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65[0]), /* 1 */ + asn_DEF_ErrorIndicationE2_IEs_tags_65, /* Same as above */ + sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65) + /sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ErrorIndicationE2_IEs_65, + 3, /* Elements count */ + &asn_SPC_ErrorIndicationE2_IEs_specs_65 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_72[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.GlobalE2node_ID), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_GlobalE2node_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "GlobalE2node-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.RANfunctions_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctions_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctions-List" + }, +}; +static const unsigned asn_MAP_value_to_canonical_72[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_72[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_72[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* eNB */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_72 = { + sizeof(struct E2setupRequestIEs__value), + offsetof(struct E2setupRequestIEs__value, _asn_ctx), + offsetof(struct E2setupRequestIEs__value, present), + sizeof(((struct E2setupRequestIEs__value *)0)->present), + asn_MAP_value_tag2el_72, + 5, /* Count of tags in the map */ + asn_MAP_value_to_canonical_72, + asn_MAP_value_from_canonical_72, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_72 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_72, + 2, /* Elements count */ + &asn_SPC_value_specs_72 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_70, &asn_PER_memb_id_constr_70, memb_id_constraint_69 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupRequestIEs_criticality_type, + { &asn_OER_memb_criticality_constr_71, &asn_PER_memb_criticality_constr_71, memb_criticality_constraint_69 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_72, + select_E2setupRequestIEs_value_type, + { &asn_OER_memb_value_constr_72, &asn_PER_memb_value_constr_72, memb_value_constraint_69 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupRequestIEs_tags_69[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupRequestIEs_tag2el_69[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69 = { + sizeof(struct E2setupRequestIEs), + offsetof(struct E2setupRequestIEs, _asn_ctx), + asn_MAP_E2setupRequestIEs_tag2el_69, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs = { + "E2setupRequestIEs", + "E2setupRequestIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupRequestIEs_tags_69, + sizeof(asn_DEF_E2setupRequestIEs_tags_69) + /sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */ + asn_DEF_E2setupRequestIEs_tags_69, /* Same as above */ + sizeof(asn_DEF_E2setupRequestIEs_tags_69) + /sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupRequestIEs_69, + 3, /* Elements count */ + &asn_SPC_E2setupRequestIEs_specs_69 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_76[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.GlobalRIC_ID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_GlobalRIC_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "GlobalRIC-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_76[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* GlobalRIC-ID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 1 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 0 } /* RANfunctionsIDcause-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_76 = { + sizeof(struct E2setupResponseIEs__value), + offsetof(struct E2setupResponseIEs__value, _asn_ctx), + offsetof(struct E2setupResponseIEs__value, present), + sizeof(((struct E2setupResponseIEs__value *)0)->present), + asn_MAP_value_tag2el_76, + 3, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_76 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_76, + 3, /* Elements count */ + &asn_SPC_value_specs_76 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_74, &asn_PER_memb_id_constr_74, memb_id_constraint_73 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupResponseIEs_criticality_type, + { &asn_OER_memb_criticality_constr_75, &asn_PER_memb_criticality_constr_75, memb_criticality_constraint_73 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_76, + select_E2setupResponseIEs_value_type, + { &asn_OER_memb_value_constr_76, &asn_PER_memb_value_constr_76, memb_value_constraint_73 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupResponseIEs_tags_73[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupResponseIEs_tag2el_73[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73 = { + sizeof(struct E2setupResponseIEs), + offsetof(struct E2setupResponseIEs, _asn_ctx), + asn_MAP_E2setupResponseIEs_tag2el_73, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs = { + "E2setupResponseIEs", + "E2setupResponseIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupResponseIEs_tags_73, + sizeof(asn_DEF_E2setupResponseIEs_tags_73) + /sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */ + asn_DEF_E2setupResponseIEs_tags_73, /* Same as above */ + sizeof(asn_DEF_E2setupResponseIEs_tags_73) + /sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupResponseIEs_73, + 3, /* Elements count */ + &asn_SPC_E2setupResponseIEs_specs_73 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_80[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TimeToWaitE2), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_TimeToWaitE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "TimeToWaitE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_80[] = { 1, 2, 0 }; +static const unsigned asn_MAP_value_from_canonical_80[] = { 2, 0, 1 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_80[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWaitE2 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_80 = { + sizeof(struct E2setupFailureIEs__value), + offsetof(struct E2setupFailureIEs__value, _asn_ctx), + offsetof(struct E2setupFailureIEs__value, present), + sizeof(((struct E2setupFailureIEs__value *)0)->present), + asn_MAP_value_tag2el_80, + 7, /* Count of tags in the map */ + asn_MAP_value_to_canonical_80, + asn_MAP_value_from_canonical_80, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_80 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_80, + 3, /* Elements count */ + &asn_SPC_value_specs_80 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_78, &asn_PER_memb_id_constr_78, memb_id_constraint_77 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupFailureIEs_criticality_type, + { &asn_OER_memb_criticality_constr_79, &asn_PER_memb_criticality_constr_79, memb_criticality_constraint_77 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_80, + select_E2setupFailureIEs_value_type, + { &asn_OER_memb_value_constr_80, &asn_PER_memb_value_constr_80, memb_value_constraint_77 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupFailureIEs_tags_77[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupFailureIEs_tag2el_77[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77 = { + sizeof(struct E2setupFailureIEs), + offsetof(struct E2setupFailureIEs, _asn_ctx), + asn_MAP_E2setupFailureIEs_tag2el_77, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs = { + "E2setupFailureIEs", + "E2setupFailureIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupFailureIEs_tags_77, + sizeof(asn_DEF_E2setupFailureIEs_tags_77) + /sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */ + asn_DEF_E2setupFailureIEs_tags_77, /* Same as above */ + sizeof(asn_DEF_E2setupFailureIEs_tags_77) + /sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupFailureIEs_77, + 3, /* Elements count */ + &asn_SPC_E2setupFailureIEs_specs_77 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_84[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_84[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = { + sizeof(struct ResetRequestIEs__value), + offsetof(struct ResetRequestIEs__value, _asn_ctx), + offsetof(struct ResetRequestIEs__value, present), + sizeof(((struct ResetRequestIEs__value *)0)->present), + asn_MAP_value_tag2el_84, + 5, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_84 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_84, + 1, /* Elements count */ + &asn_SPC_value_specs_84 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_82, &asn_PER_memb_id_constr_82, memb_id_constraint_81 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ResetRequestIEs_criticality_type, + { &asn_OER_memb_criticality_constr_83, &asn_PER_memb_criticality_constr_83, memb_criticality_constraint_81 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_84, + select_ResetRequestIEs_value_type, + { &asn_OER_memb_value_constr_84, &asn_PER_memb_value_constr_84, memb_value_constraint_81 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetRequestIEs_tags_81[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetRequestIEs_tag2el_81[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81 = { + sizeof(struct ResetRequestIEs), + offsetof(struct ResetRequestIEs, _asn_ctx), + asn_MAP_ResetRequestIEs_tag2el_81, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs = { + "ResetRequestIEs", + "ResetRequestIEs", + &asn_OP_SEQUENCE, + asn_DEF_ResetRequestIEs_tags_81, + sizeof(asn_DEF_ResetRequestIEs_tags_81) + /sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */ + asn_DEF_ResetRequestIEs_tags_81, /* Same as above */ + sizeof(asn_DEF_ResetRequestIEs_tags_81) + /sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetRequestIEs_81, + 3, /* Elements count */ + &asn_SPC_ResetRequestIEs_specs_81 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_88[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = { + sizeof(struct ResetResponseIEs__value), + offsetof(struct ResetResponseIEs__value, _asn_ctx), + offsetof(struct ResetResponseIEs__value, present), + sizeof(((struct ResetResponseIEs__value *)0)->present), + asn_MAP_value_tag2el_88, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_88 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_88, + 1, /* Elements count */ + &asn_SPC_value_specs_88 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_86, &asn_PER_memb_id_constr_86, memb_id_constraint_85 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ResetResponseIEs_criticality_type, + { &asn_OER_memb_criticality_constr_87, &asn_PER_memb_criticality_constr_87, memb_criticality_constraint_85 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_88, + select_ResetResponseIEs_value_type, + { &asn_OER_memb_value_constr_88, &asn_PER_memb_value_constr_88, memb_value_constraint_85 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetResponseIEs_tags_85[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetResponseIEs_tag2el_85[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85 = { + sizeof(struct ResetResponseIEs), + offsetof(struct ResetResponseIEs, _asn_ctx), + asn_MAP_ResetResponseIEs_tag2el_85, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs = { + "ResetResponseIEs", + "ResetResponseIEs", + &asn_OP_SEQUENCE, + asn_DEF_ResetResponseIEs_tags_85, + sizeof(asn_DEF_ResetResponseIEs_tags_85) + /sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */ + asn_DEF_ResetResponseIEs_tags_85, /* Same as above */ + sizeof(asn_DEF_ResetResponseIEs_tags_85) + /sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetResponseIEs_85, + 3, /* Elements count */ + &asn_SPC_ResetResponseIEs_specs_85 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_92[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctions_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctions_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctions-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_92[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsID-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = { + sizeof(struct RICserviceUpdate_IEs__value), + offsetof(struct RICserviceUpdate_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdate_IEs__value, present), + sizeof(((struct RICserviceUpdate_IEs__value *)0)->present), + asn_MAP_value_tag2el_92, + 2, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_92 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_92, + 2, /* Elements count */ + &asn_SPC_value_specs_92 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_90, &asn_PER_memb_id_constr_90, memb_id_constraint_89 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdate_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_91, &asn_PER_memb_criticality_constr_91, memb_criticality_constraint_89 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_92, + select_RICserviceUpdate_IEs_value_type, + { &asn_OER_memb_value_constr_92, &asn_PER_memb_value_constr_92, memb_value_constraint_89 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_89[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_89[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89 = { + sizeof(struct RICserviceUpdate_IEs), + offsetof(struct RICserviceUpdate_IEs, _asn_ctx), + asn_MAP_RICserviceUpdate_IEs_tag2el_89, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs = { + "RICserviceUpdate-IEs", + "RICserviceUpdate-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdate_IEs_tags_89, + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */ + asn_DEF_RICserviceUpdate_IEs_tags_89, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdate_IEs_89, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdate_IEs_specs_89 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_96[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_96[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsIDcause-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = { + sizeof(struct RICserviceUpdateAcknowledge_IEs__value), + offsetof(struct RICserviceUpdateAcknowledge_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdateAcknowledge_IEs__value, present), + sizeof(((struct RICserviceUpdateAcknowledge_IEs__value *)0)->present), + asn_MAP_value_tag2el_96, + 2, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_96 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_96, + 2, /* Elements count */ + &asn_SPC_value_specs_96 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_94, &asn_PER_memb_id_constr_94, memb_id_constraint_93 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdateAcknowledge_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_95, &asn_PER_memb_criticality_constr_95, memb_criticality_constraint_93 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_96, + select_RICserviceUpdateAcknowledge_IEs_value_type, + { &asn_OER_memb_value_constr_96, &asn_PER_memb_value_constr_96, memb_value_constraint_93 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 = { + sizeof(struct RICserviceUpdateAcknowledge_IEs), + offsetof(struct RICserviceUpdateAcknowledge_IEs, _asn_ctx), + asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs = { + "RICserviceUpdateAcknowledge-IEs", + "RICserviceUpdateAcknowledge-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93, + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */ + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateAcknowledge_IEs_93, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_100[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TimeToWaitE2), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_TimeToWaitE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "TimeToWaitE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_100[] = { 1, 0, 2 }; +static const unsigned asn_MAP_value_from_canonical_100[] = { 1, 0, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_100[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWaitE2 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsIDcause-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = { + sizeof(struct RICserviceUpdateFailure_IEs__value), + offsetof(struct RICserviceUpdateFailure_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdateFailure_IEs__value, present), + sizeof(((struct RICserviceUpdateFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_100, + 3, /* Count of tags in the map */ + asn_MAP_value_to_canonical_100, + asn_MAP_value_from_canonical_100, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_100 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_100, + 3, /* Elements count */ + &asn_SPC_value_specs_100 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_98, &asn_PER_memb_id_constr_98, memb_id_constraint_97 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdateFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_99, &asn_PER_memb_criticality_constr_99, memb_criticality_constraint_97 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_100, + select_RICserviceUpdateFailure_IEs_value_type, + { &asn_OER_memb_value_constr_100, &asn_PER_memb_value_constr_100, memb_value_constraint_97 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_97[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97 = { + sizeof(struct RICserviceUpdateFailure_IEs), + offsetof(struct RICserviceUpdateFailure_IEs, _asn_ctx), + asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs = { + "RICserviceUpdateFailure-IEs", + "RICserviceUpdateFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateFailure_IEs_tags_97, + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */ + asn_DEF_RICserviceUpdateFailure_IEs_tags_97, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateFailure_IEs_97, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdateFailure_IEs_specs_97 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_104[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_104[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionsID-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = { + sizeof(struct RICserviceQuery_IEs__value), + offsetof(struct RICserviceQuery_IEs__value, _asn_ctx), + offsetof(struct RICserviceQuery_IEs__value, present), + sizeof(((struct RICserviceQuery_IEs__value *)0)->present), + asn_MAP_value_tag2el_104, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_104 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_104, + 1, /* Elements count */ + &asn_SPC_value_specs_104 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_102, &asn_PER_memb_id_constr_102, memb_id_constraint_101 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceQuery_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_103, &asn_PER_memb_criticality_constr_103, memb_criticality_constraint_101 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_104, + select_RICserviceQuery_IEs_value_type, + { &asn_OER_memb_value_constr_104, &asn_PER_memb_value_constr_104, memb_value_constraint_101 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_101[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_101[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101 = { + sizeof(struct RICserviceQuery_IEs), + offsetof(struct RICserviceQuery_IEs, _asn_ctx), + asn_MAP_RICserviceQuery_IEs_tag2el_101, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs = { + "RICserviceQuery-IEs", + "RICserviceQuery-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceQuery_IEs_tags_101, + sizeof(asn_DEF_RICserviceQuery_IEs_tags_101) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */ + asn_DEF_RICserviceQuery_IEs_tags_101, /* Same as above */ + sizeof(asn_DEF_RICserviceQuery_IEs_tags_101) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceQuery_IEs_101, + 3, /* Elements count */ + &asn_SPC_RICserviceQuery_IEs_specs_101 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.h new file mode 100644 index 000000000..dd6583ec3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldE2.h @@ -0,0 +1,757 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_FieldE2_H_ +#define _ProtocolIE_FieldE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-IDE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICaction-ToBeSetup-Item.h" +#include "PresenceE2.h" +#include +#include +#include +#include "RICaction-Admitted-Item.h" +#include "RICaction-NotAdmitted-Item.h" +#include "RANfunction-Item.h" +#include "RANfunctionID-Item.h" +#include "RANfunctionIDcause-Item.h" +#include "RICrequestID.h" +#include "RANfunctionID.h" +#include "RICsubscriptionDetails.h" +#include "RICaction-Admitted-List.h" +#include "RICaction-NotAdmitted-List.h" +#include "CriticalityDiagnosticsE2.h" +#include "CauseE2.h" +#include "RICactionID.h" +#include "RICindicationSN.h" +#include "RICindicationType.h" +#include "RICindicationHeader.h" +#include "RICindicationMessage.h" +#include "RICcallProcessID.h" +#include "RICcontrolHeader.h" +#include "RICcontrolMessage.h" +#include "RICcontrolAckRequest.h" +#include "RICcontrolStatus.h" +#include "RICcontrolOutcome.h" +#include "GlobalE2node-ID.h" +#include "RANfunctions-List.h" +#include "GlobalRIC-ID.h" +#include "RANfunctionsID-List.h" +#include "RANfunctionsIDcause-List.h" +#include "TimeToWaitE2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICaction_ToBeSetup_ItemIEs__value_PR { + RICaction_ToBeSetup_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item +} RICaction_ToBeSetup_ItemIEs__value_PR; +typedef enum RICaction_Admitted_ItemIEs__value_PR { + RICaction_Admitted_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item +} RICaction_Admitted_ItemIEs__value_PR; +typedef enum RICaction_NotAdmitted_ItemIEs__value_PR { + RICaction_NotAdmitted_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item +} RICaction_NotAdmitted_ItemIEs__value_PR; +typedef enum RANfunction_ItemIEs__value_PR { + RANfunction_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunction_ItemIEs__value_PR_RANfunction_Item +} RANfunction_ItemIEs__value_PR; +typedef enum RANfunctionID_ItemIEs__value_PR { + RANfunctionID_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item +} RANfunctionID_ItemIEs__value_PR; +typedef enum RANfunctionIDcause_ItemIEs__value_PR { + RANfunctionIDcause_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item +} RANfunctionIDcause_ItemIEs__value_PR; +typedef enum RICsubscriptionRequest_IEs__value_PR { + RICsubscriptionRequest_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionRequest_IEs__value_PR_RICrequestID, + RICsubscriptionRequest_IEs__value_PR_RANfunctionID, + RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails +} RICsubscriptionRequest_IEs__value_PR; +typedef enum RICsubscriptionResponse_IEs__value_PR { + RICsubscriptionResponse_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionResponse_IEs__value_PR_RICrequestID, + RICsubscriptionResponse_IEs__value_PR_RANfunctionID, + RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List, + RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List +} RICsubscriptionResponse_IEs__value_PR; +typedef enum RICsubscriptionFailure_IEs__value_PR { + RICsubscriptionFailure_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionFailure_IEs__value_PR_RICrequestID, + RICsubscriptionFailure_IEs__value_PR_RANfunctionID, + RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List, + RICsubscriptionFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICsubscriptionFailure_IEs__value_PR; +typedef enum RICsubscriptionDeleteRequest_IEs__value_PR { + RICsubscriptionDeleteRequest_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID +} RICsubscriptionDeleteRequest_IEs__value_PR; +typedef enum RICsubscriptionDeleteResponse_IEs__value_PR { + RICsubscriptionDeleteResponse_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID +} RICsubscriptionDeleteResponse_IEs__value_PR; +typedef enum RICsubscriptionDeleteFailure_IEs__value_PR { + RICsubscriptionDeleteFailure_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID, + RICsubscriptionDeleteFailure_IEs__value_PR_CauseE2, + RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICsubscriptionDeleteFailure_IEs__value_PR; +typedef enum RICindication_IEs__value_PR { + RICindication_IEs__value_PR_NOTHING, /* No components present */ + RICindication_IEs__value_PR_RICrequestID, + RICindication_IEs__value_PR_RANfunctionID, + RICindication_IEs__value_PR_RICactionID, + RICindication_IEs__value_PR_RICindicationSN, + RICindication_IEs__value_PR_RICindicationType, + RICindication_IEs__value_PR_RICindicationHeader, + RICindication_IEs__value_PR_RICindicationMessage, + RICindication_IEs__value_PR_RICcallProcessID +} RICindication_IEs__value_PR; +typedef enum RICcontrolRequest_IEs__value_PR { + RICcontrolRequest_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolRequest_IEs__value_PR_RICrequestID, + RICcontrolRequest_IEs__value_PR_RANfunctionID, + RICcontrolRequest_IEs__value_PR_RICcallProcessID, + RICcontrolRequest_IEs__value_PR_RICcontrolHeader, + RICcontrolRequest_IEs__value_PR_RICcontrolMessage, + RICcontrolRequest_IEs__value_PR_RICcontrolAckRequest +} RICcontrolRequest_IEs__value_PR; +typedef enum RICcontrolAcknowledge_IEs__value_PR { + RICcontrolAcknowledge_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolAcknowledge_IEs__value_PR_RICrequestID, + RICcontrolAcknowledge_IEs__value_PR_RANfunctionID, + RICcontrolAcknowledge_IEs__value_PR_RICcallProcessID, + RICcontrolAcknowledge_IEs__value_PR_RICcontrolStatus, + RICcontrolAcknowledge_IEs__value_PR_RICcontrolOutcome +} RICcontrolAcknowledge_IEs__value_PR; +typedef enum RICcontrolFailure_IEs__value_PR { + RICcontrolFailure_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolFailure_IEs__value_PR_RICrequestID, + RICcontrolFailure_IEs__value_PR_RANfunctionID, + RICcontrolFailure_IEs__value_PR_RICcallProcessID, + RICcontrolFailure_IEs__value_PR_CauseE2, + RICcontrolFailure_IEs__value_PR_RICcontrolOutcome +} RICcontrolFailure_IEs__value_PR; +typedef enum ErrorIndicationE2_IEs__value_PR { + ErrorIndicationE2_IEs__value_PR_NOTHING, /* No components present */ + ErrorIndicationE2_IEs__value_PR_RICrequestID, + ErrorIndicationE2_IEs__value_PR_RANfunctionID, + ErrorIndicationE2_IEs__value_PR_CauseE2, + ErrorIndicationE2_IEs__value_PR_CriticalityDiagnosticsE2 +} ErrorIndicationE2_IEs__value_PR; +typedef enum E2setupRequestIEs__value_PR { + E2setupRequestIEs__value_PR_NOTHING, /* No components present */ + E2setupRequestIEs__value_PR_GlobalE2node_ID, + E2setupRequestIEs__value_PR_RANfunctions_List +} E2setupRequestIEs__value_PR; +typedef enum E2setupResponseIEs__value_PR { + E2setupResponseIEs__value_PR_NOTHING, /* No components present */ + E2setupResponseIEs__value_PR_GlobalRIC_ID, + E2setupResponseIEs__value_PR_RANfunctionsID_List, + E2setupResponseIEs__value_PR_RANfunctionsIDcause_List +} E2setupResponseIEs__value_PR; +typedef enum E2setupFailureIEs__value_PR { + E2setupFailureIEs__value_PR_NOTHING, /* No components present */ + E2setupFailureIEs__value_PR_CauseE2, + E2setupFailureIEs__value_PR_TimeToWaitE2, + E2setupFailureIEs__value_PR_CriticalityDiagnosticsE2 +} E2setupFailureIEs__value_PR; +typedef enum ResetRequestIEs__value_PR { + ResetRequestIEs__value_PR_NOTHING, /* No components present */ + ResetRequestIEs__value_PR_CauseE2 +} ResetRequestIEs__value_PR; +typedef enum ResetResponseIEs__value_PR { + ResetResponseIEs__value_PR_NOTHING, /* No components present */ + ResetResponseIEs__value_PR_CriticalityDiagnosticsE2 +} ResetResponseIEs__value_PR; +typedef enum RICserviceUpdate_IEs__value_PR { + RICserviceUpdate_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdate_IEs__value_PR_RANfunctions_List, + RICserviceUpdate_IEs__value_PR_RANfunctionsID_List +} RICserviceUpdate_IEs__value_PR; +typedef enum RICserviceUpdateAcknowledge_IEs__value_PR { + RICserviceUpdateAcknowledge_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List, + RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List +} RICserviceUpdateAcknowledge_IEs__value_PR; +typedef enum RICserviceUpdateFailure_IEs__value_PR { + RICserviceUpdateFailure_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdateFailure_IEs__value_PR_RANfunctionsIDcause_List, + RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2, + RICserviceUpdateFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICserviceUpdateFailure_IEs__value_PR; +typedef enum RICserviceQuery_IEs__value_PR { + RICserviceQuery_IEs__value_PR_NOTHING, /* No components present */ + RICserviceQuery_IEs__value_PR_RANfunctionsID_List +} RICserviceQuery_IEs__value_PR; + +/* ProtocolIE-FieldE2 */ +typedef struct RICaction_ToBeSetup_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_ToBeSetup_ItemIEs__value { + RICaction_ToBeSetup_ItemIEs__value_PR present; + union RICaction_ToBeSetup_ItemIEs__value_u { + RICaction_ToBeSetup_Item_t RICaction_ToBeSetup_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_ToBeSetup_ItemIEs_t; +typedef struct RICaction_Admitted_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_Admitted_ItemIEs__value { + RICaction_Admitted_ItemIEs__value_PR present; + union RICaction_Admitted_ItemIEs__value_u { + RICaction_Admitted_Item_t RICaction_Admitted_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_ItemIEs_t; +typedef struct RICaction_NotAdmitted_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_NotAdmitted_ItemIEs__value { + RICaction_NotAdmitted_ItemIEs__value_PR present; + union RICaction_NotAdmitted_ItemIEs__value_u { + RICaction_NotAdmitted_Item_t RICaction_NotAdmitted_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_ItemIEs_t; +typedef struct RANfunction_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunction_ItemIEs__value { + RANfunction_ItemIEs__value_PR present; + union RANfunction_ItemIEs__value_u { + RANfunction_Item_t RANfunction_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunction_ItemIEs_t; +typedef struct RANfunctionID_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunctionID_ItemIEs__value { + RANfunctionID_ItemIEs__value_PR present; + union RANfunctionID_ItemIEs__value_u { + RANfunctionID_Item_t RANfunctionID_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionID_ItemIEs_t; +typedef struct RANfunctionIDcause_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunctionIDcause_ItemIEs__value { + RANfunctionIDcause_ItemIEs__value_PR present; + union RANfunctionIDcause_ItemIEs__value_u { + RANfunctionIDcause_Item_t RANfunctionIDcause_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionIDcause_ItemIEs_t; +typedef struct RICsubscriptionRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionRequest_IEs__value { + RICsubscriptionRequest_IEs__value_PR present; + union RICsubscriptionRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICsubscriptionDetails_t RICsubscriptionDetails; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionRequest_IEs_t; +typedef struct RICsubscriptionResponse_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionResponse_IEs__value { + RICsubscriptionResponse_IEs__value_PR present; + union RICsubscriptionResponse_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICaction_Admitted_List_t RICaction_Admitted_List; + RICaction_NotAdmitted_List_t RICaction_NotAdmitted_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionResponse_IEs_t; +typedef struct RICsubscriptionFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionFailure_IEs__value { + RICsubscriptionFailure_IEs__value_PR present; + union RICsubscriptionFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICaction_NotAdmitted_List_t RICaction_NotAdmitted_List; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionFailure_IEs_t; +typedef struct RICsubscriptionDeleteRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteRequest_IEs__value { + RICsubscriptionDeleteRequest_IEs__value_PR present; + union RICsubscriptionDeleteRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteRequest_IEs_t; +typedef struct RICsubscriptionDeleteResponse_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteResponse_IEs__value { + RICsubscriptionDeleteResponse_IEs__value_PR present; + union RICsubscriptionDeleteResponse_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteResponse_IEs_t; +typedef struct RICsubscriptionDeleteFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteFailure_IEs__value { + RICsubscriptionDeleteFailure_IEs__value_PR present; + union RICsubscriptionDeleteFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + CauseE2_t CauseE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteFailure_IEs_t; +typedef struct RICindication_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICindication_IEs__value { + RICindication_IEs__value_PR present; + union RICindication_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICactionID_t RICactionID; + RICindicationSN_t RICindicationSN; + RICindicationType_t RICindicationType; + RICindicationHeader_t RICindicationHeader; + RICindicationMessage_t RICindicationMessage; + RICcallProcessID_t RICcallProcessID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICindication_IEs_t; +typedef struct RICcontrolRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolRequest_IEs__value { + RICcontrolRequest_IEs__value_PR present; + union RICcontrolRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + RICcontrolHeader_t RICcontrolHeader; + RICcontrolMessage_t RICcontrolMessage; + RICcontrolAckRequest_t RICcontrolAckRequest; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolRequest_IEs_t; +typedef struct RICcontrolAcknowledge_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolAcknowledge_IEs__value { + RICcontrolAcknowledge_IEs__value_PR present; + union RICcontrolAcknowledge_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + RICcontrolStatus_t RICcontrolStatus; + RICcontrolOutcome_t RICcontrolOutcome; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolAcknowledge_IEs_t; +typedef struct RICcontrolFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolFailure_IEs__value { + RICcontrolFailure_IEs__value_PR present; + union RICcontrolFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + CauseE2_t CauseE2; + RICcontrolOutcome_t RICcontrolOutcome; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolFailure_IEs_t; +typedef struct ErrorIndicationE2_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ErrorIndicationE2_IEs__value { + ErrorIndicationE2_IEs__value_PR present; + union ErrorIndicationE2_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + CauseE2_t CauseE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ErrorIndicationE2_IEs_t; +typedef struct E2setupRequestIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupRequestIEs__value { + E2setupRequestIEs__value_PR present; + union E2setupRequestIEs__value_u { + GlobalE2node_ID_t GlobalE2node_ID; + RANfunctions_List_t RANfunctions_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupRequestIEs_t; +typedef struct E2setupResponseIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupResponseIEs__value { + E2setupResponseIEs__value_PR present; + union E2setupResponseIEs__value_u { + GlobalRIC_ID_t GlobalRIC_ID; + RANfunctionsID_List_t RANfunctionsID_List; + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupResponseIEs_t; +typedef struct E2setupFailureIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupFailureIEs__value { + E2setupFailureIEs__value_PR present; + union E2setupFailureIEs__value_u { + CauseE2_t CauseE2; + TimeToWaitE2_t TimeToWaitE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupFailureIEs_t; +typedef struct ResetRequestIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ResetRequestIEs__value { + ResetRequestIEs__value_PR present; + union ResetRequestIEs__value_u { + CauseE2_t CauseE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetRequestIEs_t; +typedef struct ResetResponseIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ResetResponseIEs__value { + ResetResponseIEs__value_PR present; + union ResetResponseIEs__value_u { + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetResponseIEs_t; +typedef struct RICserviceUpdate_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdate_IEs__value { + RICserviceUpdate_IEs__value_PR present; + union RICserviceUpdate_IEs__value_u { + RANfunctions_List_t RANfunctions_List; + RANfunctionsID_List_t RANfunctionsID_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdate_IEs_t; +typedef struct RICserviceUpdateAcknowledge_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdateAcknowledge_IEs__value { + RICserviceUpdateAcknowledge_IEs__value_PR present; + union RICserviceUpdateAcknowledge_IEs__value_u { + RANfunctionsID_List_t RANfunctionsID_List; + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateAcknowledge_IEs_t; +typedef struct RICserviceUpdateFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdateFailure_IEs__value { + RICserviceUpdateFailure_IEs__value_PR present; + union RICserviceUpdateFailure_IEs__value_u { + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + TimeToWaitE2_t TimeToWaitE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateFailure_IEs_t; +typedef struct RICserviceQuery_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceQuery_IEs__value { + RICserviceQuery_IEs__value_PR present; + union RICserviceQuery_IEs__value_u { + RANfunctionsID_List_t RANfunctionsID_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceQuery_IEs_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1; +extern asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5; +extern asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9; +extern asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13; +extern asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17; +extern asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21; +extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICindication_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49; +extern asn_TYPE_member_t asn_MBR_RICindication_IEs_49[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53; +extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57; +extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61; +extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[3]; +extern asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_IEs_specs_65; +extern asn_TYPE_member_t asn_MBR_ErrorIndicationE2_IEs_65[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69; +extern asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73; +extern asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77; +extern asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[3]; +extern asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81; +extern asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[3]; +extern asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85; +extern asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101; +extern asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_FieldE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.c new file mode 100644 index 000000000..97f27971e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-FieldPairE2.h" + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.h new file mode 100644 index 000000000..bc44c61cd --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-FieldPairE2.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_FieldPairE2_H_ +#define _ProtocolIE_FieldPairE2_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_FieldPairE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.c new file mode 100644 index 000000000..7e14d9a1e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-IDE2.h" + +int +ProtocolIE_IDE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_ProtocolIE_IDE2_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +asn_per_constraints_t asn_PER_type_ProtocolIE_IDE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_IDE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_IDE2 = { + "ProtocolIE-IDE2", + "ProtocolIE-IDE2", + &asn_OP_NativeInteger, + asn_DEF_ProtocolIE_IDE2_tags_1, + sizeof(asn_DEF_ProtocolIE_IDE2_tags_1) + /sizeof(asn_DEF_ProtocolIE_IDE2_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_IDE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_IDE2_tags_1) + /sizeof(asn_DEF_ProtocolIE_IDE2_tags_1[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_IDE2_constr_1, &asn_PER_type_ProtocolIE_IDE2_constr_1, ProtocolIE_IDE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.h new file mode 100644 index 000000000..467b6eb2a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-IDE2.h @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_IDE2_H_ +#define _ProtocolIE_IDE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProtocolIE-IDE2 */ +typedef long ProtocolIE_IDE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_ProtocolIE_IDE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_IDE2; +asn_struct_free_f ProtocolIE_IDE2_free; +asn_struct_print_f ProtocolIE_IDE2_print; +asn_constr_check_f ProtocolIE_IDE2_constraint; +ber_type_decoder_f ProtocolIE_IDE2_decode_ber; +der_type_encoder_f ProtocolIE_IDE2_encode_der; +xer_type_decoder_f ProtocolIE_IDE2_decode_xer; +xer_type_encoder_f ProtocolIE_IDE2_encode_xer; +oer_type_decoder_f ProtocolIE_IDE2_decode_oer; +oer_type_encoder_f ProtocolIE_IDE2_encode_oer; +per_type_decoder_f ProtocolIE_IDE2_decode_uper; +per_type_encoder_f ProtocolIE_IDE2_encode_uper; +per_type_decoder_f ProtocolIE_IDE2_decode_aper; +per_type_encoder_f ProtocolIE_IDE2_encode_aper; +#define ProtocolIE_IDE2_id_CauseE2 ((ProtocolIE_IDE2_t)1) +#define ProtocolIE_IDE2_id_CriticalityDiagnosticsE2 ((ProtocolIE_IDE2_t)2) +#define ProtocolIE_IDE2_id_GlobalE2node_ID ((ProtocolIE_IDE2_t)3) +#define ProtocolIE_IDE2_id_GlobalRIC_ID ((ProtocolIE_IDE2_t)4) +#define ProtocolIE_IDE2_id_RANfunctionID ((ProtocolIE_IDE2_t)5) +#define ProtocolIE_IDE2_id_RANfunctionID_Item ((ProtocolIE_IDE2_t)6) +#define ProtocolIE_IDE2_id_RANfunctionIEcause_Item ((ProtocolIE_IDE2_t)7) +#define ProtocolIE_IDE2_id_RANfunction_Item ((ProtocolIE_IDE2_t)8) +#define ProtocolIE_IDE2_id_RANfunctionsAccepted ((ProtocolIE_IDE2_t)9) +#define ProtocolIE_IDE2_id_RANfunctionsAdded ((ProtocolIE_IDE2_t)10) +#define ProtocolIE_IDE2_id_RANfunctionsDeleted ((ProtocolIE_IDE2_t)11) +#define ProtocolIE_IDE2_id_RANfunctionsModified ((ProtocolIE_IDE2_t)12) +#define ProtocolIE_IDE2_id_RANfunctionsRejected ((ProtocolIE_IDE2_t)13) +#define ProtocolIE_IDE2_id_RICaction_Admitted_Item ((ProtocolIE_IDE2_t)14) +#define ProtocolIE_IDE2_id_RICactionID ((ProtocolIE_IDE2_t)15) +#define ProtocolIE_IDE2_id_RICaction_NotAdmitted_Item ((ProtocolIE_IDE2_t)16) +#define ProtocolIE_IDE2_id_RICactions_Admitted ((ProtocolIE_IDE2_t)17) +#define ProtocolIE_IDE2_id_RICactions_NotAdmitted ((ProtocolIE_IDE2_t)18) +#define ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item ((ProtocolIE_IDE2_t)19) +#define ProtocolIE_IDE2_id_RICcallProcessID ((ProtocolIE_IDE2_t)20) +#define ProtocolIE_IDE2_id_RICcontrolAckRequest ((ProtocolIE_IDE2_t)21) +#define ProtocolIE_IDE2_id_RICcontrolHeader ((ProtocolIE_IDE2_t)22) +#define ProtocolIE_IDE2_id_RICcontrolMessage ((ProtocolIE_IDE2_t)23) +#define ProtocolIE_IDE2_id_RICcontrolStatus ((ProtocolIE_IDE2_t)24) +#define ProtocolIE_IDE2_id_RICindicationHeader ((ProtocolIE_IDE2_t)25) +#define ProtocolIE_IDE2_id_RICindicationMessage ((ProtocolIE_IDE2_t)26) +#define ProtocolIE_IDE2_id_RICindicationSN ((ProtocolIE_IDE2_t)27) +#define ProtocolIE_IDE2_id_RICindicationType ((ProtocolIE_IDE2_t)28) +#define ProtocolIE_IDE2_id_RICrequestID ((ProtocolIE_IDE2_t)29) +#define ProtocolIE_IDE2_id_RICsubscriptionDetails ((ProtocolIE_IDE2_t)30) +#define ProtocolIE_IDE2_id_TimeToWaitE2 ((ProtocolIE_IDE2_t)31) +#define ProtocolIE_IDE2_id_RICcontrolOutcome ((ProtocolIE_IDE2_t)32) + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_IDE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.c b/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.c new file mode 100644 index 000000000..e5f3df3fe --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.c @@ -0,0 +1,147 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-SingleContainerE2.h" + +/* + * This type is implemented using RICaction_ToBeSetup_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RICaction_Admitted_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RICaction_NotAdmitted_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunction_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunctionID_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunctionIDcause_ItemIEs, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_ItemIEs_1, + 3, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_ItemIEs_5, + 3, /* Elements count */ + &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_ItemIEs_9, + 3, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.h b/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.h new file mode 100644 index 000000000..8ce37aa60 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ProtocolIE-SingleContainerE2.h @@ -0,0 +1,120 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_SingleContainerE2_H_ +#define _ProtocolIE_SingleContainerE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-FieldE2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProtocolIE-SingleContainerE2 */ +typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainerE2_1410P0_t; +typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P1_t; +typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P2_t; +typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainerE2_1410P3_t; +typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainerE2_1410P4_t; +typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainerE2_1410P5_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P0_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P0_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P0_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P1_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P1_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P1_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P2_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P2_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P2_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P3_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P3_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P3_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P4_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P4_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P4_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P5_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P5_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P5_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_SingleContainerE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunction-Item.c b/src/codec_utils/E2AP_MASTER/RANfunction-Item.c new file mode 100644 index 000000000..bf53aca18 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunction-Item.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunction-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionDefinition), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionDefinition" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionRevision), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionRevision, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionRevision" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunction_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranFunctionDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ranFunctionRevision */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Item_specs_1 = { + sizeof(struct RANfunction_Item), + offsetof(struct RANfunction_Item, _asn_ctx), + asn_MAP_RANfunction_Item_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = { + "RANfunction-Item", + "RANfunction-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_Item_tags_1, + sizeof(asn_DEF_RANfunction_Item_tags_1) + /sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunction_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunction_Item_tags_1) + /sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_Item_1, + 3, /* Elements count */ + &asn_SPC_RANfunction_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunction-Item.h b/src/codec_utils/E2AP_MASTER/RANfunction-Item.h new file mode 100644 index 000000000..5e2eb14c8 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunction-Item.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunction_Item_H_ +#define _RANfunction_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "RANfunctionDefinition.h" +#include "RANfunctionRevision.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunction-Item */ +typedef struct RANfunction_Item { + RANfunctionID_t ranFunctionID; + RANfunctionDefinition_t ranFunctionDefinition; + RANfunctionRevision_t ranFunctionRevision; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunction_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunction_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.c b/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.c new file mode 100644 index 000000000..bc0a7ccef --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RANfunctionDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition = { + "RANfunctionDefinition", + "RANfunctionDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RANfunctionDefinition_tags_1, + sizeof(asn_DEF_RANfunctionDefinition_tags_1) + /sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionDefinition_tags_1) + /sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.h b/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.h new file mode 100644 index 000000000..2329fe6ca --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionDefinition_H_ +#define _RANfunctionDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionDefinition */ +typedef OCTET_STRING_t RANfunctionDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition; +asn_struct_free_f RANfunctionDefinition_free; +asn_struct_print_f RANfunctionDefinition_print; +asn_constr_check_f RANfunctionDefinition_constraint; +ber_type_decoder_f RANfunctionDefinition_decode_ber; +der_type_encoder_f RANfunctionDefinition_encode_der; +xer_type_decoder_f RANfunctionDefinition_decode_xer; +xer_type_encoder_f RANfunctionDefinition_encode_xer; +oer_type_decoder_f RANfunctionDefinition_decode_oer; +oer_type_encoder_f RANfunctionDefinition_encode_oer; +per_type_decoder_f RANfunctionDefinition_decode_uper; +per_type_encoder_f RANfunctionDefinition_encode_uper; +per_type_decoder_f RANfunctionDefinition_decode_aper; +per_type_encoder_f RANfunctionDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.c b/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.c new file mode 100644 index 000000000..53bea0aa4 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionID-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionRevision), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionRevision, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionRevision" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ranFunctionRevision */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_Item_specs_1 = { + sizeof(struct RANfunctionID_Item), + offsetof(struct RANfunctionID_Item, _asn_ctx), + asn_MAP_RANfunctionID_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item = { + "RANfunctionID-Item", + "RANfunctionID-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionID_Item_tags_1, + sizeof(asn_DEF_RANfunctionID_Item_tags_1) + /sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionID_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_Item_tags_1) + /sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_Item_1, + 2, /* Elements count */ + &asn_SPC_RANfunctionID_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.h b/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.h new file mode 100644 index 000000000..a787c712f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionID-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionID_Item_H_ +#define _RANfunctionID_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "RANfunctionRevision.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionID-Item */ +typedef struct RANfunctionID_Item { + RANfunctionID_t ranFunctionID; + RANfunctionRevision_t ranFunctionRevision; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionID_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionID_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionID.c b/src/codec_utils/E2AP_MASTER/RANfunctionID.c new file mode 100644 index 000000000..dc77a8213 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionID.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionID.h" + +int +RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 4095)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RANfunctionID_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..4095) */, + -1}; +asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID = { + "RANfunctionID", + "RANfunctionID", + &asn_OP_NativeInteger, + asn_DEF_RANfunctionID_tags_1, + sizeof(asn_DEF_RANfunctionID_tags_1) + /sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionID_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_tags_1) + /sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionID_constr_1, &asn_PER_type_RANfunctionID_constr_1, RANfunctionID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionID.h b/src/codec_utils/E2AP_MASTER/RANfunctionID.h new file mode 100644 index 000000000..3e1c08e43 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionID_H_ +#define _RANfunctionID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionID */ +typedef long RANfunctionID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID; +asn_struct_free_f RANfunctionID_free; +asn_struct_print_f RANfunctionID_print; +asn_constr_check_f RANfunctionID_constraint; +ber_type_decoder_f RANfunctionID_decode_ber; +der_type_encoder_f RANfunctionID_encode_der; +xer_type_decoder_f RANfunctionID_decode_xer; +xer_type_encoder_f RANfunctionID_encode_xer; +oer_type_decoder_f RANfunctionID_decode_oer; +oer_type_encoder_f RANfunctionID_encode_oer; +per_type_decoder_f RANfunctionID_decode_uper; +per_type_encoder_f RANfunctionID_encode_uper; +per_type_decoder_f RANfunctionID_decode_aper; +per_type_encoder_f RANfunctionID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.c b/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.c new file mode 100644 index 000000000..64c6782ae --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionIDcause-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_Item_specs_1 = { + sizeof(struct RANfunctionIDcause_Item), + offsetof(struct RANfunctionIDcause_Item, _asn_ctx), + asn_MAP_RANfunctionIDcause_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item = { + "RANfunctionIDcause-Item", + "RANfunctionIDcause-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionIDcause_Item_tags_1, + sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1) + /sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionIDcause_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1) + /sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_Item_1, + 2, /* Elements count */ + &asn_SPC_RANfunctionIDcause_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.h b/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.h new file mode 100644 index 000000000..f967404be --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionIDcause-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionIDcause_Item_H_ +#define _RANfunctionIDcause_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "CauseE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionIDcause-Item */ +typedef struct RANfunctionIDcause_Item { + RANfunctionID_t ranFunctionID; + CauseE2_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionIDcause_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionIDcause_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionRevision.c b/src/codec_utils/E2AP_MASTER/RANfunctionRevision.c new file mode 100644 index 000000000..46215d699 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionRevision.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionRevision.h" + +int +RANfunctionRevision_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 4095)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RANfunctionRevision_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..4095) */, + -1}; +asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionRevision_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision = { + "RANfunctionRevision", + "RANfunctionRevision", + &asn_OP_NativeInteger, + asn_DEF_RANfunctionRevision_tags_1, + sizeof(asn_DEF_RANfunctionRevision_tags_1) + /sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionRevision_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionRevision_tags_1) + /sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionRevision_constr_1, &asn_PER_type_RANfunctionRevision_constr_1, RANfunctionRevision_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionRevision.h b/src/codec_utils/E2AP_MASTER/RANfunctionRevision.h new file mode 100644 index 000000000..f31677084 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionRevision.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionRevision_H_ +#define _RANfunctionRevision_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionRevision */ +typedef long RANfunctionRevision_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision; +asn_struct_free_f RANfunctionRevision_free; +asn_struct_print_f RANfunctionRevision_print; +asn_constr_check_f RANfunctionRevision_constraint; +ber_type_decoder_f RANfunctionRevision_decode_ber; +der_type_encoder_f RANfunctionRevision_encode_der; +xer_type_decoder_f RANfunctionRevision_decode_xer; +xer_type_encoder_f RANfunctionRevision_encode_xer; +oer_type_decoder_f RANfunctionRevision_decode_oer; +oer_type_encoder_f RANfunctionRevision_encode_oer; +per_type_decoder_f RANfunctionRevision_decode_uper; +per_type_encoder_f RANfunctionRevision_encode_uper; +per_type_decoder_f RANfunctionRevision_decode_aper; +per_type_encoder_f RANfunctionRevision_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionRevision_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctions-List.c b/src/codec_utils/E2AP_MASTER/RANfunctions-List.c new file mode 100644 index 000000000..6414f6c93 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctions-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctions-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctions_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctions_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctions_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctions_List_specs_1 = { + sizeof(struct RANfunctions_List), + offsetof(struct RANfunctions_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctions_List = { + "RANfunctions-List", + "RANfunctions-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctions_List_tags_1, + sizeof(asn_DEF_RANfunctions_List_tags_1) + /sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctions_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctions_List_tags_1) + /sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctions_List_constr_1, &asn_PER_type_RANfunctions_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctions_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctions_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctions-List.h b/src/codec_utils/E2AP_MASTER/RANfunctions-List.h new file mode 100644 index 000000000..e90722b42 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctions-List.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctions_List_H_ +#define _RANfunctions_List_H_ + + +#include +//#include "ProtocolIE_SingleContainerE2.h" + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctions-List */ +typedef struct RANfunctions_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P3_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctions_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctions_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctions_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.c b/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.c new file mode 100644 index 000000000..5d3f1262d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionsID-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P4, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionsID_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctionsID_List_specs_1 = { + sizeof(struct RANfunctionsID_List), + offsetof(struct RANfunctionsID_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List = { + "RANfunctionsID-List", + "RANfunctionsID-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctionsID_List_tags_1, + sizeof(asn_DEF_RANfunctionsID_List_tags_1) + /sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionsID_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionsID_List_tags_1) + /sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionsID_List_constr_1, &asn_PER_type_RANfunctionsID_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctionsID_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctionsID_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.h b/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.h new file mode 100644 index 000000000..381c4f424 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionsID-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionsID_List_H_ +#define _RANfunctionsID_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctionsID-List */ +typedef struct RANfunctionsID_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P4_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionsID_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionsID_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.c b/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.c new file mode 100644 index 000000000..a0bf56eb7 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionsIDcause-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P5, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionsIDcause_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctionsIDcause_List_specs_1 = { + sizeof(struct RANfunctionsIDcause_List), + offsetof(struct RANfunctionsIDcause_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List = { + "RANfunctionsIDcause-List", + "RANfunctionsIDcause-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctionsIDcause_List_tags_1, + sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1) + /sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionsIDcause_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1) + /sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionsIDcause_List_constr_1, &asn_PER_type_RANfunctionsIDcause_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctionsIDcause_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctionsIDcause_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.h b/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.h new file mode 100644 index 000000000..02de48210 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RANfunctionsIDcause-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionsIDcause_List_H_ +#define _RANfunctionsIDcause_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctionsIDcause-List */ +typedef struct RANfunctionsIDcause_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P5_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionsIDcause_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionsIDcause_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.c b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.c new file mode 100644 index 000000000..7d22606f6 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-Admitted-Item.h" + +static asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ricActionID */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_Item_specs_1 = { + sizeof(struct RICaction_Admitted_Item), + offsetof(struct RICaction_Admitted_Item, _asn_ctx), + asn_MAP_RICaction_Admitted_Item_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item = { + "RICaction-Admitted-Item", + "RICaction-Admitted-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_Admitted_Item_tags_1, + sizeof(asn_DEF_RICaction_Admitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_Admitted_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_Item_1, + 1, /* Elements count */ + &asn_SPC_RICaction_Admitted_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.h b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.h new file mode 100644 index 000000000..ce84e2983 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-Item.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_Admitted_Item_H_ +#define _RICaction_Admitted_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICaction-Admitted-Item */ +typedef struct RICaction_Admitted_Item { + RICactionID_t ricActionID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_Admitted_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.c b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.c new file mode 100644 index 000000000..4b47c173f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-Admitted-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..16)) */}; +static asn_per_constraints_t asn_PER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RICaction_Admitted_List_specs_1 = { + sizeof(struct RICaction_Admitted_List), + offsetof(struct RICaction_Admitted_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List = { + "RICaction-Admitted-List", + "RICaction-Admitted-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICaction_Admitted_List_tags_1, + sizeof(asn_DEF_RICaction_Admitted_List_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */ + asn_DEF_RICaction_Admitted_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_List_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICaction_Admitted_List_constr_1, &asn_PER_type_RICaction_Admitted_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICaction_Admitted_List_1, + 1, /* Single element */ + &asn_SPC_RICaction_Admitted_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.h b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.h new file mode 100644 index 000000000..858d6abf5 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-Admitted-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_Admitted_List_H_ +#define _RICaction_Admitted_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICaction-Admitted-List */ +typedef struct RICaction_Admitted_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P1_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_Admitted_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.c b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.c new file mode 100644 index 000000000..376f43d78 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-NotAdmitted-Item.h" + +static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_Item_specs_1 = { + sizeof(struct RICaction_NotAdmitted_Item), + offsetof(struct RICaction_NotAdmitted_Item, _asn_ctx), + asn_MAP_RICaction_NotAdmitted_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item = { + "RICaction-NotAdmitted-Item", + "RICaction-NotAdmitted-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_NotAdmitted_Item_tags_1, + sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_Item_1, + 2, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.h b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.h new file mode 100644 index 000000000..7c43e7f8e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_NotAdmitted_Item_H_ +#define _RICaction_NotAdmitted_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include "CauseE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICaction-NotAdmitted-Item */ +typedef struct RICaction_NotAdmitted_Item { + RICactionID_t ricActionID; + CauseE2_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_NotAdmitted_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.c b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.c new file mode 100644 index 000000000..c5f3ba4b3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-NotAdmitted-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..16)) */}; +static asn_per_constraints_t asn_PER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 0, 16 } /* (SIZE(0..16)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RICaction_NotAdmitted_List_specs_1 = { + sizeof(struct RICaction_NotAdmitted_List), + offsetof(struct RICaction_NotAdmitted_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List = { + "RICaction-NotAdmitted-List", + "RICaction-NotAdmitted-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICaction_NotAdmitted_List_tags_1, + sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICaction_NotAdmitted_List_constr_1, &asn_PER_type_RICaction_NotAdmitted_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICaction_NotAdmitted_List_1, + 1, /* Single element */ + &asn_SPC_RICaction_NotAdmitted_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.h b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.h new file mode 100644 index 000000000..3b146f644 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-NotAdmitted-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_NotAdmitted_List_H_ +#define _RICaction_NotAdmitted_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICaction-NotAdmitted-List */ +typedef struct RICaction_NotAdmitted_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_NotAdmitted_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.c b/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.c new file mode 100644 index 000000000..cecdcd423 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.c @@ -0,0 +1,83 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-ToBeSetup-Item.h" + +#include "RICsubsequentAction.h" +static asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionType), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionType" + }, + { ATF_POINTER, 2, offsetof(struct RICaction_ToBeSetup_Item, ricActionDefinition), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionDefinition" + }, + { ATF_POINTER, 1, offsetof(struct RICaction_ToBeSetup_Item, ricSubsequentAction), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICsubsequentAction, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricSubsequentAction" + }, +}; +static const int asn_MAP_RICaction_ToBeSetup_Item_oms_1[] = { 2, 3 }; +static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricActionType */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ricActionDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ricSubsequentAction */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_Item_specs_1 = { + sizeof(struct RICaction_ToBeSetup_Item), + offsetof(struct RICaction_ToBeSetup_Item, _asn_ctx), + asn_MAP_RICaction_ToBeSetup_Item_tag2el_1, + 4, /* Count of tags in the map */ + asn_MAP_RICaction_ToBeSetup_Item_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 4, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item = { + "RICaction-ToBeSetup-Item", + "RICaction-ToBeSetup-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_ToBeSetup_Item_tags_1, + sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_ToBeSetup_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_Item_1, + 4, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.h b/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.h new file mode 100644 index 000000000..5003dcf72 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICaction-ToBeSetup-Item.h @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_ToBeSetup_Item_H_ +#define _RICaction_ToBeSetup_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include "RICactionType.h" +#include "RICactionDefinition.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICsubsequentAction; + +/* RICaction-ToBeSetup-Item */ +typedef struct RICaction_ToBeSetup_Item { + RICactionID_t ricActionID; + RICactionType_t ricActionType; + RICactionDefinition_t *ricActionDefinition; /* OPTIONAL */ + struct RICsubsequentAction *ricSubsequentAction; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_ToBeSetup_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_ToBeSetup_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICactionDefinition.c b/src/codec_utils/E2AP_MASTER/RICactionDefinition.c new file mode 100644 index 000000000..c8600b3c3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICactionDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionDefinition = { + "RICactionDefinition", + "RICactionDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RICactionDefinition_tags_1, + sizeof(asn_DEF_RICactionDefinition_tags_1) + /sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */ + asn_DEF_RICactionDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionDefinition_tags_1) + /sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICactionDefinition.h b/src/codec_utils/E2AP_MASTER/RICactionDefinition.h new file mode 100644 index 000000000..9822a347b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionDefinition_H_ +#define _RICactionDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICactionDefinition */ +typedef OCTET_STRING_t RICactionDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICactionDefinition; +asn_struct_free_f RICactionDefinition_free; +asn_struct_print_f RICactionDefinition_print; +asn_constr_check_f RICactionDefinition_constraint; +ber_type_decoder_f RICactionDefinition_decode_ber; +der_type_encoder_f RICactionDefinition_encode_der; +xer_type_decoder_f RICactionDefinition_decode_xer; +xer_type_encoder_f RICactionDefinition_encode_xer; +oer_type_decoder_f RICactionDefinition_decode_oer; +oer_type_encoder_f RICactionDefinition_encode_oer; +per_type_decoder_f RICactionDefinition_decode_uper; +per_type_encoder_f RICactionDefinition_encode_uper; +per_type_decoder_f RICactionDefinition_decode_aper; +per_type_encoder_f RICactionDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICactionID.c b/src/codec_utils/E2AP_MASTER/RICactionID.c new file mode 100644 index 000000000..25b71fefa --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionID.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionID.h" + +int +RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICactionID_constr_1 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +asn_per_constraints_t asn_PER_type_RICactionID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RICactionID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionID = { + "RICactionID", + "RICactionID", + &asn_OP_NativeInteger, + asn_DEF_RICactionID_tags_1, + sizeof(asn_DEF_RICactionID_tags_1) + /sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */ + asn_DEF_RICactionID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionID_tags_1) + /sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactionID_constr_1, &asn_PER_type_RICactionID_constr_1, RICactionID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICactionID.h b/src/codec_utils/E2AP_MASTER/RICactionID.h new file mode 100644 index 000000000..b058d8e39 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionID_H_ +#define _RICactionID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICactionID */ +typedef long RICactionID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICactionID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICactionID; +asn_struct_free_f RICactionID_free; +asn_struct_print_f RICactionID_print; +asn_constr_check_f RICactionID_constraint; +ber_type_decoder_f RICactionID_decode_ber; +der_type_encoder_f RICactionID_encode_der; +xer_type_decoder_f RICactionID_decode_xer; +xer_type_encoder_f RICactionID_encode_xer; +oer_type_decoder_f RICactionID_decode_oer; +oer_type_encoder_f RICactionID_encode_oer; +per_type_decoder_f RICactionID_decode_uper; +per_type_encoder_f RICactionID_encode_uper; +per_type_decoder_f RICactionID_decode_aper; +per_type_encoder_f RICactionID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICactionType.c b/src/codec_utils/E2AP_MASTER/RICactionType.c new file mode 100644 index 000000000..f4cb0cf43 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionType.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICactionType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICactionType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICactionType_value2enum_1[] = { + { 0, 6, "report" }, + { 1, 6, "insert" }, + { 2, 6, "policy" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICactionType_enum2value_1[] = { + 1, /* insert(1) */ + 2, /* policy(2) */ + 0 /* report(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1 = { + asn_MAP_RICactionType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICactionType_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICactionType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionType = { + "RICactionType", + "RICactionType", + &asn_OP_NativeEnumerated, + asn_DEF_RICactionType_tags_1, + sizeof(asn_DEF_RICactionType_tags_1) + /sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */ + asn_DEF_RICactionType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionType_tags_1) + /sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactionType_constr_1, &asn_PER_type_RICactionType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICactionType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICactionType.h b/src/codec_utils/E2AP_MASTER/RICactionType.h new file mode 100644 index 000000000..89f402fa1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactionType.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionType_H_ +#define _RICactionType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICactionType { + RICactionType_report = 0, + RICactionType_insert = 1, + RICactionType_policy = 2 + /* + * Enumeration is extensible + */ +} e_RICactionType; + +/* RICactionType */ +typedef long RICactionType_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICactionType_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICactionType; +extern const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1; +asn_struct_free_f RICactionType_free; +asn_struct_print_f RICactionType_print; +asn_constr_check_f RICactionType_constraint; +ber_type_decoder_f RICactionType_decode_ber; +der_type_encoder_f RICactionType_encode_der; +xer_type_decoder_f RICactionType_decode_xer; +xer_type_encoder_f RICactionType_encode_xer; +oer_type_decoder_f RICactionType_decode_oer; +oer_type_encoder_f RICactionType_encode_oer; +per_type_decoder_f RICactionType_decode_uper; +per_type_encoder_f RICactionType_encode_uper; +per_type_decoder_f RICactionType_decode_aper; +per_type_encoder_f RICactionType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionType_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.c b/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.c new file mode 100644 index 000000000..2439ca781 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactions-ToBeSetup-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..16)) */}; +asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P0, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICactions_ToBeSetup_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1 = { + sizeof(struct RICactions_ToBeSetup_List), + offsetof(struct RICactions_ToBeSetup_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List = { + "RICactions-ToBeSetup-List", + "RICactions-ToBeSetup-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICactions_ToBeSetup_List_tags_1, + sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1) + /sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */ + asn_DEF_RICactions_ToBeSetup_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1) + /sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactions_ToBeSetup_List_constr_1, &asn_PER_type_RICactions_ToBeSetup_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICactions_ToBeSetup_List_1, + 1, /* Single element */ + &asn_SPC_RICactions_ToBeSetup_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.h b/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.h new file mode 100644 index 000000000..6ece2f122 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICactions-ToBeSetup-List.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactions_ToBeSetup_List_H_ +#define _RICactions_ToBeSetup_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICactions-ToBeSetup-List */ +typedef struct RICactions_ToBeSetup_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P0_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICactions_ToBeSetup_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List; +extern asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1; +extern asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[1]; +extern asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactions_ToBeSetup_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcallProcessID.c b/src/codec_utils/E2AP_MASTER/RICcallProcessID.c new file mode 100644 index 000000000..b1caab37d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcallProcessID.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcallProcessID.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcallProcessID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcallProcessID = { + "RICcallProcessID", + "RICcallProcessID", + &asn_OP_OCTET_STRING, + asn_DEF_RICcallProcessID_tags_1, + sizeof(asn_DEF_RICcallProcessID_tags_1) + /sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */ + asn_DEF_RICcallProcessID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcallProcessID_tags_1) + /sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcallProcessID.h b/src/codec_utils/E2AP_MASTER/RICcallProcessID.h new file mode 100644 index 000000000..8d06076a5 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcallProcessID.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcallProcessID_H_ +#define _RICcallProcessID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcallProcessID */ +typedef OCTET_STRING_t RICcallProcessID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcallProcessID; +asn_struct_free_f RICcallProcessID_free; +asn_struct_print_f RICcallProcessID_print; +asn_constr_check_f RICcallProcessID_constraint; +ber_type_decoder_f RICcallProcessID_decode_ber; +der_type_encoder_f RICcallProcessID_encode_der; +xer_type_decoder_f RICcallProcessID_decode_xer; +xer_type_encoder_f RICcallProcessID_encode_xer; +oer_type_decoder_f RICcallProcessID_decode_oer; +oer_type_encoder_f RICcallProcessID_encode_oer; +per_type_decoder_f RICcallProcessID_decode_uper; +per_type_encoder_f RICcallProcessID_encode_uper; +per_type_decoder_f RICcallProcessID_decode_aper; +per_type_encoder_f RICcallProcessID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcallProcessID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.c b/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.c new file mode 100644 index 000000000..8ef27b7c9 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolAckRequest.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolAckRequest_value2enum_1[] = { + { 0, 5, "noAck" }, + { 1, 3, "ack" }, + { 2, 4, "nAck" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICcontrolAckRequest_enum2value_1[] = { + 1, /* ack(1) */ + 2, /* nAck(2) */ + 0 /* noAck(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICcontrolAckRequest_specs_1 = { + asn_MAP_RICcontrolAckRequest_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICcontrolAckRequest_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAckRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest = { + "RICcontrolAckRequest", + "RICcontrolAckRequest", + &asn_OP_NativeEnumerated, + asn_DEF_RICcontrolAckRequest_tags_1, + sizeof(asn_DEF_RICcontrolAckRequest_tags_1) + /sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolAckRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolAckRequest_tags_1) + /sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */ + { &asn_OER_type_RICcontrolAckRequest_constr_1, &asn_PER_type_RICcontrolAckRequest_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICcontrolAckRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.h b/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.h new file mode 100644 index 000000000..73ef88a0b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolAckRequest.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolAckRequest_H_ +#define _RICcontrolAckRequest_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICcontrolAckRequest { + RICcontrolAckRequest_noAck = 0, + RICcontrolAckRequest_ack = 1, + RICcontrolAckRequest_nAck = 2 + /* + * Enumeration is extensible + */ +} e_RICcontrolAckRequest; + +/* RICcontrolAckRequest */ +typedef long RICcontrolAckRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest; +asn_struct_free_f RICcontrolAckRequest_free; +asn_struct_print_f RICcontrolAckRequest_print; +asn_constr_check_f RICcontrolAckRequest_constraint; +ber_type_decoder_f RICcontrolAckRequest_decode_ber; +der_type_encoder_f RICcontrolAckRequest_encode_der; +xer_type_decoder_f RICcontrolAckRequest_decode_xer; +xer_type_encoder_f RICcontrolAckRequest_encode_xer; +oer_type_decoder_f RICcontrolAckRequest_decode_oer; +oer_type_encoder_f RICcontrolAckRequest_encode_oer; +per_type_decoder_f RICcontrolAckRequest_decode_uper; +per_type_encoder_f RICcontrolAckRequest_encode_uper; +per_type_decoder_f RICcontrolAckRequest_decode_aper; +per_type_encoder_f RICcontrolAckRequest_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolAckRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.c b/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.c new file mode 100644 index 000000000..a4cb659cb --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolAcknowledge.h" + +asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P8, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = { + sizeof(struct RICcontrolAcknowledge), + offsetof(struct RICcontrolAcknowledge, _asn_ctx), + asn_MAP_RICcontrolAcknowledge_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge = { + "RICcontrolAcknowledge", + "RICcontrolAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolAcknowledge_tags_1, + sizeof(asn_DEF_RICcontrolAcknowledge_tags_1) + /sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolAcknowledge_tags_1) + /sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.h b/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.h new file mode 100644 index 000000000..a288d3563 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolAcknowledge_H_ +#define _RICcontrolAcknowledge_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolAcknowledge */ +typedef struct RICcontrolAcknowledge { + ProtocolIE_ContainerE2_1407P8_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolAcknowledge_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolFailure.c b/src/codec_utils/E2AP_MASTER/RICcontrolFailure.c new file mode 100644 index 000000000..ee6affe82 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolFailure.h" + +asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P9, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = { + sizeof(struct RICcontrolFailure), + offsetof(struct RICcontrolFailure, _asn_ctx), + asn_MAP_RICcontrolFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure = { + "RICcontrolFailure", + "RICcontrolFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolFailure_tags_1, + sizeof(asn_DEF_RICcontrolFailure_tags_1) + /sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolFailure_tags_1) + /sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolFailure_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolFailure.h b/src/codec_utils/E2AP_MASTER/RICcontrolFailure.h new file mode 100644 index 000000000..5659bb6c5 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolFailure_H_ +#define _RICcontrolFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolFailure */ +typedef struct RICcontrolFailure { + ProtocolIE_ContainerE2_1407P9_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolHeader.c b/src/codec_utils/E2AP_MASTER/RICcontrolHeader.c new file mode 100644 index 000000000..01449fe2e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolHeader.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolHeader.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolHeader_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader = { + "RICcontrolHeader", + "RICcontrolHeader", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolHeader_tags_1, + sizeof(asn_DEF_RICcontrolHeader_tags_1) + /sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolHeader_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolHeader_tags_1) + /sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolHeader.h b/src/codec_utils/E2AP_MASTER/RICcontrolHeader.h new file mode 100644 index 000000000..f73fd59ef --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolHeader.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolHeader_H_ +#define _RICcontrolHeader_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolHeader */ +typedef OCTET_STRING_t RICcontrolHeader_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader; +asn_struct_free_f RICcontrolHeader_free; +asn_struct_print_f RICcontrolHeader_print; +asn_constr_check_f RICcontrolHeader_constraint; +ber_type_decoder_f RICcontrolHeader_decode_ber; +der_type_encoder_f RICcontrolHeader_encode_der; +xer_type_decoder_f RICcontrolHeader_decode_xer; +xer_type_encoder_f RICcontrolHeader_encode_xer; +oer_type_decoder_f RICcontrolHeader_decode_oer; +oer_type_encoder_f RICcontrolHeader_encode_oer; +per_type_decoder_f RICcontrolHeader_decode_uper; +per_type_encoder_f RICcontrolHeader_encode_uper; +per_type_decoder_f RICcontrolHeader_decode_aper; +per_type_encoder_f RICcontrolHeader_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolHeader_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolMessage.c b/src/codec_utils/E2AP_MASTER/RICcontrolMessage.c new file mode 100644 index 000000000..f073a04bb --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolMessage.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolMessage.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolMessage_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage = { + "RICcontrolMessage", + "RICcontrolMessage", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolMessage_tags_1, + sizeof(asn_DEF_RICcontrolMessage_tags_1) + /sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolMessage_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolMessage_tags_1) + /sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolMessage.h b/src/codec_utils/E2AP_MASTER/RICcontrolMessage.h new file mode 100644 index 000000000..05d608e8b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolMessage.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolMessage_H_ +#define _RICcontrolMessage_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolMessage */ +typedef OCTET_STRING_t RICcontrolMessage_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage; +asn_struct_free_f RICcontrolMessage_free; +asn_struct_print_f RICcontrolMessage_print; +asn_constr_check_f RICcontrolMessage_constraint; +ber_type_decoder_f RICcontrolMessage_decode_ber; +der_type_encoder_f RICcontrolMessage_encode_der; +xer_type_decoder_f RICcontrolMessage_decode_xer; +xer_type_encoder_f RICcontrolMessage_encode_xer; +oer_type_decoder_f RICcontrolMessage_decode_oer; +oer_type_encoder_f RICcontrolMessage_encode_oer; +per_type_decoder_f RICcontrolMessage_decode_uper; +per_type_encoder_f RICcontrolMessage_encode_uper; +per_type_decoder_f RICcontrolMessage_decode_aper; +per_type_encoder_f RICcontrolMessage_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolMessage_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.c b/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.c new file mode 100644 index 000000000..388a53500 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolOutcome.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolOutcome_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome = { + "RICcontrolOutcome", + "RICcontrolOutcome", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolOutcome_tags_1, + sizeof(asn_DEF_RICcontrolOutcome_tags_1) + /sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolOutcome_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolOutcome_tags_1) + /sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.h b/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.h new file mode 100644 index 000000000..92396ceb0 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolOutcome.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolOutcome_H_ +#define _RICcontrolOutcome_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolOutcome */ +typedef OCTET_STRING_t RICcontrolOutcome_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome; +asn_struct_free_f RICcontrolOutcome_free; +asn_struct_print_f RICcontrolOutcome_print; +asn_constr_check_f RICcontrolOutcome_constraint; +ber_type_decoder_f RICcontrolOutcome_decode_ber; +der_type_encoder_f RICcontrolOutcome_encode_der; +xer_type_decoder_f RICcontrolOutcome_decode_xer; +xer_type_encoder_f RICcontrolOutcome_encode_xer; +oer_type_decoder_f RICcontrolOutcome_decode_oer; +oer_type_encoder_f RICcontrolOutcome_encode_oer; +per_type_decoder_f RICcontrolOutcome_decode_uper; +per_type_encoder_f RICcontrolOutcome_encode_uper; +per_type_decoder_f RICcontrolOutcome_decode_aper; +per_type_encoder_f RICcontrolOutcome_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolOutcome_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolRequest.c b/src/codec_utils/E2AP_MASTER/RICcontrolRequest.c new file mode 100644 index 000000000..f326e050d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolRequest.h" + +asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P7, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = { + sizeof(struct RICcontrolRequest), + offsetof(struct RICcontrolRequest, _asn_ctx), + asn_MAP_RICcontrolRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest = { + "RICcontrolRequest", + "RICcontrolRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolRequest_tags_1, + sizeof(asn_DEF_RICcontrolRequest_tags_1) + /sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolRequest_tags_1) + /sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolRequest_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolRequest.h b/src/codec_utils/E2AP_MASTER/RICcontrolRequest.h new file mode 100644 index 000000000..9f35b5d9e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolRequest_H_ +#define _RICcontrolRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolRequest */ +typedef struct RICcontrolRequest { + ProtocolIE_ContainerE2_1407P7_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolStatus.c b/src/codec_utils/E2AP_MASTER/RICcontrolStatus.c new file mode 100644 index 000000000..73e3356c6 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolStatus.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolStatus.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICcontrolStatus_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICcontrolStatus_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolStatus_value2enum_1[] = { + { 0, 7, "success" }, + { 1, 8, "rejected" }, + { 2, 6, "failed" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICcontrolStatus_enum2value_1[] = { + 2, /* failed(2) */ + 1, /* rejected(1) */ + 0 /* success(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICcontrolStatus_specs_1 = { + asn_MAP_RICcontrolStatus_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICcontrolStatus_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolStatus_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus = { + "RICcontrolStatus", + "RICcontrolStatus", + &asn_OP_NativeEnumerated, + asn_DEF_RICcontrolStatus_tags_1, + sizeof(asn_DEF_RICcontrolStatus_tags_1) + /sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolStatus_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolStatus_tags_1) + /sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */ + { &asn_OER_type_RICcontrolStatus_constr_1, &asn_PER_type_RICcontrolStatus_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICcontrolStatus_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICcontrolStatus.h b/src/codec_utils/E2AP_MASTER/RICcontrolStatus.h new file mode 100644 index 000000000..95711c697 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICcontrolStatus.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolStatus_H_ +#define _RICcontrolStatus_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICcontrolStatus { + RICcontrolStatus_success = 0, + RICcontrolStatus_rejected = 1, + RICcontrolStatus_failed = 2 + /* + * Enumeration is extensible + */ +} e_RICcontrolStatus; + +/* RICcontrolStatus */ +typedef long RICcontrolStatus_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus; +asn_struct_free_f RICcontrolStatus_free; +asn_struct_print_f RICcontrolStatus_print; +asn_constr_check_f RICcontrolStatus_constraint; +ber_type_decoder_f RICcontrolStatus_decode_ber; +der_type_encoder_f RICcontrolStatus_encode_der; +xer_type_decoder_f RICcontrolStatus_decode_xer; +xer_type_encoder_f RICcontrolStatus_encode_xer; +oer_type_decoder_f RICcontrolStatus_decode_oer; +oer_type_encoder_f RICcontrolStatus_encode_oer; +per_type_decoder_f RICcontrolStatus_decode_uper; +per_type_encoder_f RICcontrolStatus_encode_uper; +per_type_decoder_f RICcontrolStatus_decode_aper; +per_type_encoder_f RICcontrolStatus_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolStatus_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.c b/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.c new file mode 100644 index 000000000..f4eb284cf --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICeventTriggerDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICeventTriggerDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition = { + "RICeventTriggerDefinition", + "RICeventTriggerDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RICeventTriggerDefinition_tags_1, + sizeof(asn_DEF_RICeventTriggerDefinition_tags_1) + /sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */ + asn_DEF_RICeventTriggerDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RICeventTriggerDefinition_tags_1) + /sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.h b/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.h new file mode 100644 index 000000000..635908cc8 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICeventTriggerDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICeventTriggerDefinition_H_ +#define _RICeventTriggerDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICeventTriggerDefinition */ +typedef OCTET_STRING_t RICeventTriggerDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition; +asn_struct_free_f RICeventTriggerDefinition_free; +asn_struct_print_f RICeventTriggerDefinition_print; +asn_constr_check_f RICeventTriggerDefinition_constraint; +ber_type_decoder_f RICeventTriggerDefinition_decode_ber; +der_type_encoder_f RICeventTriggerDefinition_encode_der; +xer_type_decoder_f RICeventTriggerDefinition_decode_xer; +xer_type_encoder_f RICeventTriggerDefinition_encode_xer; +oer_type_decoder_f RICeventTriggerDefinition_decode_oer; +oer_type_encoder_f RICeventTriggerDefinition_encode_oer; +per_type_decoder_f RICeventTriggerDefinition_decode_uper; +per_type_encoder_f RICeventTriggerDefinition_encode_uper; +per_type_decoder_f RICeventTriggerDefinition_decode_aper; +per_type_encoder_f RICeventTriggerDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICeventTriggerDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICindication.c b/src/codec_utils/E2AP_MASTER/RICindication.c new file mode 100644 index 000000000..10376a879 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindication.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindication.h" + +asn_TYPE_member_t asn_MBR_RICindication_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P6, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICindication_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICindication_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = { + sizeof(struct RICindication), + offsetof(struct RICindication, _asn_ctx), + asn_MAP_RICindication_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICindication = { + "RICindication", + "RICindication", + &asn_OP_SEQUENCE, + asn_DEF_RICindication_tags_1, + sizeof(asn_DEF_RICindication_tags_1) + /sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */ + asn_DEF_RICindication_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindication_tags_1) + /sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICindication_1, + 1, /* Elements count */ + &asn_SPC_RICindication_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICindication.h b/src/codec_utils/E2AP_MASTER/RICindication.h new file mode 100644 index 000000000..d4d170a71 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindication.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindication_H_ +#define _RICindication_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindication */ +typedef struct RICindication { + ProtocolIE_ContainerE2_1407P6_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICindication_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindication; +extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1; +extern asn_TYPE_member_t asn_MBR_RICindication_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindication_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICindicationHeader.c b/src/codec_utils/E2AP_MASTER/RICindicationHeader.c new file mode 100644 index 000000000..feed94e7a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationHeader.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationHeader.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICindicationHeader_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationHeader = { + "RICindicationHeader", + "RICindicationHeader", + &asn_OP_OCTET_STRING, + asn_DEF_RICindicationHeader_tags_1, + sizeof(asn_DEF_RICindicationHeader_tags_1) + /sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */ + asn_DEF_RICindicationHeader_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationHeader_tags_1) + /sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICindicationHeader.h b/src/codec_utils/E2AP_MASTER/RICindicationHeader.h new file mode 100644 index 000000000..1164809fc --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationHeader.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationHeader_H_ +#define _RICindicationHeader_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationHeader */ +typedef OCTET_STRING_t RICindicationHeader_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationHeader; +asn_struct_free_f RICindicationHeader_free; +asn_struct_print_f RICindicationHeader_print; +asn_constr_check_f RICindicationHeader_constraint; +ber_type_decoder_f RICindicationHeader_decode_ber; +der_type_encoder_f RICindicationHeader_encode_der; +xer_type_decoder_f RICindicationHeader_decode_xer; +xer_type_encoder_f RICindicationHeader_encode_xer; +oer_type_decoder_f RICindicationHeader_decode_oer; +oer_type_encoder_f RICindicationHeader_encode_oer; +per_type_decoder_f RICindicationHeader_decode_uper; +per_type_encoder_f RICindicationHeader_encode_uper; +per_type_decoder_f RICindicationHeader_decode_aper; +per_type_encoder_f RICindicationHeader_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationHeader_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICindicationMessage.c b/src/codec_utils/E2AP_MASTER/RICindicationMessage.c new file mode 100644 index 000000000..e9c74dc3b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationMessage.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationMessage.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICindicationMessage_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationMessage = { + "RICindicationMessage", + "RICindicationMessage", + &asn_OP_OCTET_STRING, + asn_DEF_RICindicationMessage_tags_1, + sizeof(asn_DEF_RICindicationMessage_tags_1) + /sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */ + asn_DEF_RICindicationMessage_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationMessage_tags_1) + /sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICindicationMessage.h b/src/codec_utils/E2AP_MASTER/RICindicationMessage.h new file mode 100644 index 000000000..82e7608b3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationMessage.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationMessage_H_ +#define _RICindicationMessage_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationMessage */ +typedef OCTET_STRING_t RICindicationMessage_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationMessage; +asn_struct_free_f RICindicationMessage_free; +asn_struct_print_f RICindicationMessage_print; +asn_constr_check_f RICindicationMessage_constraint; +ber_type_decoder_f RICindicationMessage_decode_ber; +der_type_encoder_f RICindicationMessage_encode_der; +xer_type_decoder_f RICindicationMessage_decode_xer; +xer_type_encoder_f RICindicationMessage_encode_xer; +oer_type_decoder_f RICindicationMessage_decode_oer; +oer_type_encoder_f RICindicationMessage_encode_oer; +per_type_decoder_f RICindicationMessage_decode_uper; +per_type_encoder_f RICindicationMessage_encode_uper; +per_type_decoder_f RICindicationMessage_decode_aper; +per_type_encoder_f RICindicationMessage_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationMessage_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICindicationSN.c b/src/codec_utils/E2AP_MASTER/RICindicationSN.c new file mode 100644 index 000000000..8afca171e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationSN.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationSN.h" + +int +RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICindicationSN_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_type_RICindicationSN_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RICindicationSN_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationSN = { + "RICindicationSN", + "RICindicationSN", + &asn_OP_NativeInteger, + asn_DEF_RICindicationSN_tags_1, + sizeof(asn_DEF_RICindicationSN_tags_1) + /sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */ + asn_DEF_RICindicationSN_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationSN_tags_1) + /sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */ + { &asn_OER_type_RICindicationSN_constr_1, &asn_PER_type_RICindicationSN_constr_1, RICindicationSN_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICindicationSN.h b/src/codec_utils/E2AP_MASTER/RICindicationSN.h new file mode 100644 index 000000000..1c7167293 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationSN.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationSN_H_ +#define _RICindicationSN_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationSN */ +typedef long RICindicationSN_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationSN; +asn_struct_free_f RICindicationSN_free; +asn_struct_print_f RICindicationSN_print; +asn_constr_check_f RICindicationSN_constraint; +ber_type_decoder_f RICindicationSN_decode_ber; +der_type_encoder_f RICindicationSN_encode_der; +xer_type_decoder_f RICindicationSN_decode_xer; +xer_type_encoder_f RICindicationSN_encode_xer; +oer_type_decoder_f RICindicationSN_decode_oer; +oer_type_encoder_f RICindicationSN_encode_oer; +per_type_decoder_f RICindicationSN_decode_uper; +per_type_encoder_f RICindicationSN_encode_uper; +per_type_decoder_f RICindicationSN_decode_aper; +per_type_encoder_f RICindicationSN_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationSN_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICindicationType.c b/src/codec_utils/E2AP_MASTER/RICindicationType.c new file mode 100644 index 000000000..a00907e95 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationType.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICindicationType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICindicationType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICindicationType_value2enum_1[] = { + { 0, 6, "report" }, + { 1, 6, "insert" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICindicationType_enum2value_1[] = { + 1, /* insert(1) */ + 0 /* report(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICindicationType_specs_1 = { + asn_MAP_RICindicationType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICindicationType_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICindicationType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationType = { + "RICindicationType", + "RICindicationType", + &asn_OP_NativeEnumerated, + asn_DEF_RICindicationType_tags_1, + sizeof(asn_DEF_RICindicationType_tags_1) + /sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */ + asn_DEF_RICindicationType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationType_tags_1) + /sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICindicationType_constr_1, &asn_PER_type_RICindicationType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICindicationType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICindicationType.h b/src/codec_utils/E2AP_MASTER/RICindicationType.h new file mode 100644 index 000000000..23614b934 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICindicationType.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationType_H_ +#define _RICindicationType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICindicationType { + RICindicationType_report = 0, + RICindicationType_insert = 1 + /* + * Enumeration is extensible + */ +} e_RICindicationType; + +/* RICindicationType */ +typedef long RICindicationType_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationType; +asn_struct_free_f RICindicationType_free; +asn_struct_print_f RICindicationType_print; +asn_constr_check_f RICindicationType_constraint; +ber_type_decoder_f RICindicationType_decode_ber; +der_type_encoder_f RICindicationType_encode_der; +xer_type_decoder_f RICindicationType_decode_xer; +xer_type_encoder_f RICindicationType_encode_xer; +oer_type_decoder_f RICindicationType_decode_oer; +oer_type_encoder_f RICindicationType_encode_oer; +per_type_decoder_f RICindicationType_decode_uper; +per_type_encoder_f RICindicationType_encode_uper; +per_type_decoder_f RICindicationType_decode_aper; +per_type_encoder_f RICindicationType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationType_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICrequestID.c b/src/codec_utils/E2AP_MASTER/RICrequestID.c new file mode 100644 index 000000000..2e34c8da4 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICrequestID.c @@ -0,0 +1,126 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICrequestID.h" + +static int +memb_ricRequestorID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ricInstanceID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_ricRequestorID_constr_2 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ricRequestorID_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ricInstanceID_constr_3 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ricInstanceID_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_RICrequestID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricRequestorID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ricRequestorID_constr_2, &asn_PER_memb_ricRequestorID_constr_2, memb_ricRequestorID_constraint_1 }, + 0, 0, /* No default value */ + "ricRequestorID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricInstanceID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ricInstanceID_constr_3, &asn_PER_memb_ricInstanceID_constr_3, memb_ricInstanceID_constraint_1 }, + 0, 0, /* No default value */ + "ricInstanceID" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICrequestID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICrequestID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequestorID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricInstanceID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1 = { + sizeof(struct RICrequestID), + offsetof(struct RICrequestID, _asn_ctx), + asn_MAP_RICrequestID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICrequestID = { + "RICrequestID", + "RICrequestID", + &asn_OP_SEQUENCE, + asn_DEF_RICrequestID_tags_1, + sizeof(asn_DEF_RICrequestID_tags_1) + /sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */ + asn_DEF_RICrequestID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICrequestID_tags_1) + /sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICrequestID_1, + 2, /* Elements count */ + &asn_SPC_RICrequestID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICrequestID.h b/src/codec_utils/E2AP_MASTER/RICrequestID.h new file mode 100644 index 000000000..2114a7c9a --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICrequestID.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICrequestID_H_ +#define _RICrequestID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICrequestID */ +typedef struct RICrequestID { + long ricRequestorID; + long ricInstanceID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICrequestID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICrequestID; +extern asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1; +extern asn_TYPE_member_t asn_MBR_RICrequestID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICrequestID_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICserviceQuery.c b/src/codec_utils/E2AP_MASTER/RICserviceQuery.c new file mode 100644 index 000000000..6cdf79711 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceQuery.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceQuery.h" + +asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P19, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceQuery_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = { + sizeof(struct RICserviceQuery), + offsetof(struct RICserviceQuery, _asn_ctx), + asn_MAP_RICserviceQuery_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceQuery = { + "RICserviceQuery", + "RICserviceQuery", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceQuery_tags_1, + sizeof(asn_DEF_RICserviceQuery_tags_1) + /sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */ + asn_DEF_RICserviceQuery_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceQuery_tags_1) + /sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceQuery_1, + 1, /* Elements count */ + &asn_SPC_RICserviceQuery_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICserviceQuery.h b/src/codec_utils/E2AP_MASTER/RICserviceQuery.h new file mode 100644 index 000000000..454412976 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceQuery.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceQuery_H_ +#define _RICserviceQuery_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceQuery */ +typedef struct RICserviceQuery { + ProtocolIE_ContainerE2_1407P19_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceQuery_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceQuery_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceQuery_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdate.c b/src/codec_utils/E2AP_MASTER/RICserviceUpdate.c new file mode 100644 index 000000000..34224756c --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdate.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdate.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P16, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = { + sizeof(struct RICserviceUpdate), + offsetof(struct RICserviceUpdate, _asn_ctx), + asn_MAP_RICserviceUpdate_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate = { + "RICserviceUpdate", + "RICserviceUpdate", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdate_tags_1, + sizeof(asn_DEF_RICserviceUpdate_tags_1) + /sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdate_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdate_tags_1) + /sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdate_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdate_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdate.h b/src/codec_utils/E2AP_MASTER/RICserviceUpdate.h new file mode 100644 index 000000000..a817b3d25 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdate.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdate_H_ +#define _RICserviceUpdate_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdate */ +typedef struct RICserviceUpdate { + ProtocolIE_ContainerE2_1407P16_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdate_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdate_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.c b/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.c new file mode 100644 index 000000000..debb9463f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdateAcknowledge.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P17, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = { + sizeof(struct RICserviceUpdateAcknowledge), + offsetof(struct RICserviceUpdateAcknowledge, _asn_ctx), + asn_MAP_RICserviceUpdateAcknowledge_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge = { + "RICserviceUpdateAcknowledge", + "RICserviceUpdateAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateAcknowledge_tags_1, + sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdateAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdateAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.h b/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.h new file mode 100644 index 000000000..b6927a00f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdateAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdateAcknowledge_H_ +#define _RICserviceUpdateAcknowledge_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdateAcknowledge */ +typedef struct RICserviceUpdateAcknowledge { + ProtocolIE_ContainerE2_1407P17_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdateAcknowledge_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.c b/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.c new file mode 100644 index 000000000..cef1a5ef3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdateFailure.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P18, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = { + sizeof(struct RICserviceUpdateFailure), + offsetof(struct RICserviceUpdateFailure, _asn_ctx), + asn_MAP_RICserviceUpdateFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure = { + "RICserviceUpdateFailure", + "RICserviceUpdateFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateFailure_tags_1, + sizeof(asn_DEF_RICserviceUpdateFailure_tags_1) + /sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdateFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateFailure_tags_1) + /sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateFailure_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdateFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.h b/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.h new file mode 100644 index 000000000..9b636392f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICserviceUpdateFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdateFailure_H_ +#define _RICserviceUpdateFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdateFailure */ +typedef struct RICserviceUpdateFailure { + ProtocolIE_ContainerE2_1407P18_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdateFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.c new file mode 100644 index 000000000..41752ec2b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteFailure.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P5, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = { + sizeof(struct RICsubscriptionDeleteFailure), + offsetof(struct RICsubscriptionDeleteFailure, _asn_ctx), + asn_MAP_RICsubscriptionDeleteFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure = { + "RICsubscriptionDeleteFailure", + "RICsubscriptionDeleteFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteFailure_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteFailure_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.h new file mode 100644 index 000000000..407f66d77 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteFailure_H_ +#define _RICsubscriptionDeleteFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteFailure */ +typedef struct RICsubscriptionDeleteFailure { + ProtocolIE_ContainerE2_1407P5_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.c new file mode 100644 index 000000000..baf2f2770 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteRequest.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = { + sizeof(struct RICsubscriptionDeleteRequest), + offsetof(struct RICsubscriptionDeleteRequest, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest = { + "RICsubscriptionDeleteRequest", + "RICsubscriptionDeleteRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteRequest_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteRequest_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.h new file mode 100644 index 000000000..ec2aaf0a1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteRequest_H_ +#define _RICsubscriptionDeleteRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteRequest */ +typedef struct RICsubscriptionDeleteRequest { + ProtocolIE_ContainerE2_1407P3_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.c new file mode 100644 index 000000000..187e8baeb --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteResponse.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P4, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = { + sizeof(struct RICsubscriptionDeleteResponse), + offsetof(struct RICsubscriptionDeleteResponse, _asn_ctx), + asn_MAP_RICsubscriptionDeleteResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse = { + "RICsubscriptionDeleteResponse", + "RICsubscriptionDeleteResponse", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteResponse_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteResponse_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.h new file mode 100644 index 000000000..a601a4332 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDeleteResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteResponse_H_ +#define _RICsubscriptionDeleteResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteResponse */ +typedef struct RICsubscriptionDeleteResponse { + ProtocolIE_ContainerE2_1407P4_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.c new file mode 100644 index 000000000..064be1ad0 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDetails.h" + +static asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricEventTriggerDefinition), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICeventTriggerDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricEventTriggerDefinition" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricAction_ToBeSetup_List), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactions_ToBeSetup_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricAction-ToBeSetup-List" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDetails_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDetails_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricEventTriggerDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricAction-ToBeSetup-List */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDetails_specs_1 = { + sizeof(struct RICsubscriptionDetails), + offsetof(struct RICsubscriptionDetails, _asn_ctx), + asn_MAP_RICsubscriptionDetails_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails = { + "RICsubscriptionDetails", + "RICsubscriptionDetails", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDetails_tags_1, + sizeof(asn_DEF_RICsubscriptionDetails_tags_1) + /sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDetails_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDetails_tags_1) + /sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDetails_1, + 2, /* Elements count */ + &asn_SPC_RICsubscriptionDetails_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.h new file mode 100644 index 000000000..e25d8662c --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionDetails.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDetails_H_ +#define _RICsubscriptionDetails_H_ + + +#include + +/* Including external dependencies */ +#include "RICeventTriggerDefinition.h" +#include "RICactions-ToBeSetup-List.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDetails */ +typedef struct RICsubscriptionDetails { + RICeventTriggerDefinition_t ricEventTriggerDefinition; + RICactions_ToBeSetup_List_t ricAction_ToBeSetup_List; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDetails_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDetails_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.c new file mode 100644 index 000000000..141a5a1f7 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionFailure.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = { + sizeof(struct RICsubscriptionFailure), + offsetof(struct RICsubscriptionFailure, _asn_ctx), + asn_MAP_RICsubscriptionFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure = { + "RICsubscriptionFailure", + "RICsubscriptionFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionFailure_tags_1, + sizeof(asn_DEF_RICsubscriptionFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionFailure_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.h new file mode 100644 index 000000000..a0ba284bd --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionFailure_H_ +#define _RICsubscriptionFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionFailure */ +typedef struct RICsubscriptionFailure { + ProtocolIE_ContainerE2_1407P2_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.c new file mode 100644 index 000000000..5a9a020ad --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionRequest.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P0, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = { + sizeof(struct RICsubscriptionRequest), + offsetof(struct RICsubscriptionRequest, _asn_ctx), + asn_MAP_RICsubscriptionRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest = { + "RICsubscriptionRequest", + "RICsubscriptionRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionRequest_tags_1, + sizeof(asn_DEF_RICsubscriptionRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionRequest_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.h new file mode 100644 index 000000000..c92e05ed9 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionRequest_H_ +#define _RICsubscriptionRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionRequest */ +typedef struct RICsubscriptionRequest { + ProtocolIE_ContainerE2_1407P0_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.c b/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.c new file mode 100644 index 000000000..0ac75b23e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionResponse.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = { + sizeof(struct RICsubscriptionResponse), + offsetof(struct RICsubscriptionResponse, _asn_ctx), + asn_MAP_RICsubscriptionResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse = { + "RICsubscriptionResponse", + "RICsubscriptionResponse", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionResponse_tags_1, + sizeof(asn_DEF_RICsubscriptionResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionResponse_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.h b/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.h new file mode 100644 index 000000000..0fbcff36f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubscriptionResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionResponse_H_ +#define _RICsubscriptionResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionResponse */ +typedef struct RICsubscriptionResponse { + ProtocolIE_ContainerE2_1407P1_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubsequentAction.c b/src/codec_utils/E2AP_MASTER/RICsubsequentAction.c new file mode 100644 index 000000000..e6f899506 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubsequentAction.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubsequentAction.h" + +asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricSubsequentActionType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICsubsequentActionType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricSubsequentActionType" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricTimeToWait), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICtimeToWait, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricTimeToWait" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubsequentAction_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubsequentAction_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricSubsequentActionType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricTimeToWait */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1 = { + sizeof(struct RICsubsequentAction), + offsetof(struct RICsubsequentAction, _asn_ctx), + asn_MAP_RICsubsequentAction_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction = { + "RICsubsequentAction", + "RICsubsequentAction", + &asn_OP_SEQUENCE, + asn_DEF_RICsubsequentAction_tags_1, + sizeof(asn_DEF_RICsubsequentAction_tags_1) + /sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */ + asn_DEF_RICsubsequentAction_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubsequentAction_tags_1) + /sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubsequentAction_1, + 2, /* Elements count */ + &asn_SPC_RICsubsequentAction_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubsequentAction.h b/src/codec_utils/E2AP_MASTER/RICsubsequentAction.h new file mode 100644 index 000000000..1496df33f --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubsequentAction.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubsequentAction_H_ +#define _RICsubsequentAction_H_ + + +#include + +/* Including external dependencies */ +#include "RICsubsequentActionType.h" +#include "RICtimeToWait.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubsequentAction */ +typedef struct RICsubsequentAction { + RICsubsequentActionType_t ricSubsequentActionType; + RICtimeToWait_t ricTimeToWait; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubsequentAction_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubsequentAction_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.c b/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.c new file mode 100644 index 000000000..050b1b55d --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubsequentActionType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICsubsequentActionType_value2enum_1[] = { + { 0, 8, "continue" }, + { 1, 4, "wait" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICsubsequentActionType_enum2value_1[] = { + 0, /* continue(0) */ + 1 /* wait(1) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1 = { + asn_MAP_RICsubsequentActionType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICsubsequentActionType_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICsubsequentActionType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType = { + "RICsubsequentActionType", + "RICsubsequentActionType", + &asn_OP_NativeEnumerated, + asn_DEF_RICsubsequentActionType_tags_1, + sizeof(asn_DEF_RICsubsequentActionType_tags_1) + /sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */ + asn_DEF_RICsubsequentActionType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubsequentActionType_tags_1) + /sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICsubsequentActionType_constr_1, &asn_PER_type_RICsubsequentActionType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICsubsequentActionType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.h b/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.h new file mode 100644 index 000000000..c41df0acc --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICsubsequentActionType.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubsequentActionType_H_ +#define _RICsubsequentActionType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICsubsequentActionType { + RICsubsequentActionType_continue = 0, + RICsubsequentActionType_wait = 1 + /* + * Enumeration is extensible + */ +} e_RICsubsequentActionType; + +/* RICsubsequentActionType */ +typedef long RICsubsequentActionType_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType; +extern const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1; +asn_struct_free_f RICsubsequentActionType_free; +asn_struct_print_f RICsubsequentActionType_print; +asn_constr_check_f RICsubsequentActionType_constraint; +ber_type_decoder_f RICsubsequentActionType_decode_ber; +der_type_encoder_f RICsubsequentActionType_encode_der; +xer_type_decoder_f RICsubsequentActionType_decode_xer; +xer_type_encoder_f RICsubsequentActionType_encode_xer; +oer_type_decoder_f RICsubsequentActionType_decode_oer; +oer_type_encoder_f RICsubsequentActionType_encode_oer; +per_type_decoder_f RICsubsequentActionType_decode_uper; +per_type_encoder_f RICsubsequentActionType_encode_uper; +per_type_decoder_f RICsubsequentActionType_decode_aper; +per_type_encoder_f RICsubsequentActionType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubsequentActionType_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/RICtimeToWait.c b/src/codec_utils/E2AP_MASTER/RICtimeToWait.c new file mode 100644 index 000000000..488974f8b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICtimeToWait.c @@ -0,0 +1,90 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICtimeToWait.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICtimeToWait_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 17 } /* (0..17,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICtimeToWait_value2enum_1[] = { + { 0, 4, "zero" }, + { 1, 4, "w1ms" }, + { 2, 4, "w2ms" }, + { 3, 4, "w5ms" }, + { 4, 5, "w10ms" }, + { 5, 5, "w20ms" }, + { 6, 5, "w30ms" }, + { 7, 5, "w40ms" }, + { 8, 5, "w50ms" }, + { 9, 6, "w100ms" }, + { 10, 6, "w200ms" }, + { 11, 6, "w500ms" }, + { 12, 3, "w1s" }, + { 13, 3, "w2s" }, + { 14, 3, "w5s" }, + { 15, 4, "w10s" }, + { 16, 4, "w20s" }, + { 17, 4, "w60s" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICtimeToWait_enum2value_1[] = { + 9, /* w100ms(9) */ + 4, /* w10ms(4) */ + 15, /* w10s(15) */ + 1, /* w1ms(1) */ + 12, /* w1s(12) */ + 10, /* w200ms(10) */ + 5, /* w20ms(5) */ + 16, /* w20s(16) */ + 2, /* w2ms(2) */ + 13, /* w2s(13) */ + 6, /* w30ms(6) */ + 7, /* w40ms(7) */ + 11, /* w500ms(11) */ + 8, /* w50ms(8) */ + 3, /* w5ms(3) */ + 14, /* w5s(14) */ + 17, /* w60s(17) */ + 0 /* zero(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1 = { + asn_MAP_RICtimeToWait_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICtimeToWait_enum2value_1, /* N => "tag"; sorted by N */ + 18, /* Number of elements in the maps */ + 19, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICtimeToWait_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICtimeToWait = { + "RICtimeToWait", + "RICtimeToWait", + &asn_OP_NativeEnumerated, + asn_DEF_RICtimeToWait_tags_1, + sizeof(asn_DEF_RICtimeToWait_tags_1) + /sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */ + asn_DEF_RICtimeToWait_tags_1, /* Same as above */ + sizeof(asn_DEF_RICtimeToWait_tags_1) + /sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */ + { &asn_OER_type_RICtimeToWait_constr_1, &asn_PER_type_RICtimeToWait_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICtimeToWait_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/RICtimeToWait.h b/src/codec_utils/E2AP_MASTER/RICtimeToWait.h new file mode 100644 index 000000000..a4d0a71ef --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/RICtimeToWait.h @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICtimeToWait_H_ +#define _RICtimeToWait_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICtimeToWait { + RICtimeToWait_zero = 0, + RICtimeToWait_w1ms = 1, + RICtimeToWait_w2ms = 2, + RICtimeToWait_w5ms = 3, + RICtimeToWait_w10ms = 4, + RICtimeToWait_w20ms = 5, + RICtimeToWait_w30ms = 6, + RICtimeToWait_w40ms = 7, + RICtimeToWait_w50ms = 8, + RICtimeToWait_w100ms = 9, + RICtimeToWait_w200ms = 10, + RICtimeToWait_w500ms = 11, + RICtimeToWait_w1s = 12, + RICtimeToWait_w2s = 13, + RICtimeToWait_w5s = 14, + RICtimeToWait_w10s = 15, + RICtimeToWait_w20s = 16, + RICtimeToWait_w60s = 17 + /* + * Enumeration is extensible + */ +} e_RICtimeToWait; + +/* RICtimeToWait */ +typedef long RICtimeToWait_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICtimeToWait; +extern const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1; +asn_struct_free_f RICtimeToWait_free; +asn_struct_print_f RICtimeToWait_print; +asn_constr_check_f RICtimeToWait_constraint; +ber_type_decoder_f RICtimeToWait_decode_ber; +der_type_encoder_f RICtimeToWait_encode_der; +xer_type_decoder_f RICtimeToWait_decode_xer; +xer_type_encoder_f RICtimeToWait_encode_xer; +oer_type_decoder_f RICtimeToWait_decode_oer; +oer_type_encoder_f RICtimeToWait_encode_oer; +per_type_decoder_f RICtimeToWait_decode_uper; +per_type_encoder_f RICtimeToWait_encode_uper; +per_type_decoder_f RICtimeToWait_decode_aper; +per_type_encoder_f RICtimeToWait_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICtimeToWait_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ResetRequest.c b/src/codec_utils/E2AP_MASTER/ResetRequest.c new file mode 100644 index 000000000..2793af7f4 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ResetRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ResetRequest.h" + +asn_TYPE_member_t asn_MBR_ResetRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P14, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = { + sizeof(struct ResetRequest), + offsetof(struct ResetRequest, _asn_ctx), + asn_MAP_ResetRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetRequest = { + "ResetRequest", + "ResetRequest", + &asn_OP_SEQUENCE, + asn_DEF_ResetRequest_tags_1, + sizeof(asn_DEF_ResetRequest_tags_1) + /sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */ + asn_DEF_ResetRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_ResetRequest_tags_1) + /sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetRequest_1, + 1, /* Elements count */ + &asn_SPC_ResetRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ResetRequest.h b/src/codec_utils/E2AP_MASTER/ResetRequest.h new file mode 100644 index 000000000..bc7f37093 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ResetRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ResetRequest_H_ +#define _ResetRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ResetRequest */ +typedef struct ResetRequest { + ProtocolIE_ContainerE2_1407P14_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ResetRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_ResetRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ResetRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/ResetResponse.c b/src/codec_utils/E2AP_MASTER/ResetResponse.c new file mode 100644 index 000000000..e92274917 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ResetResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ResetResponse.h" + +asn_TYPE_member_t asn_MBR_ResetResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P15, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = { + sizeof(struct ResetResponse), + offsetof(struct ResetResponse, _asn_ctx), + asn_MAP_ResetResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetResponse = { + "ResetResponse", + "ResetResponse", + &asn_OP_SEQUENCE, + asn_DEF_ResetResponse_tags_1, + sizeof(asn_DEF_ResetResponse_tags_1) + /sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */ + asn_DEF_ResetResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_ResetResponse_tags_1) + /sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetResponse_1, + 1, /* Elements count */ + &asn_SPC_ResetResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/ResetResponse.h b/src/codec_utils/E2AP_MASTER/ResetResponse.h new file mode 100644 index 000000000..668029db0 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/ResetResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ResetResponse_H_ +#define _ResetResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ResetResponse */ +typedef struct ResetResponse { + ProtocolIE_ContainerE2_1407P15_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ResetResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_ResetResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ResetResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.c b/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.c new file mode 100644 index 000000000..af0051874 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.c @@ -0,0 +1,368 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "SuccessfulOutcomeE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_SuccessfulOutcomeE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_SuccessfulOutcomeE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 1; /* &SuccessfulOutcomeE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICsubscriptionResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICsubscriptionDeleteResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICserviceUpdateAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateAcknowledge, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdateAcknowledge" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICcontrolAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolAcknowledge, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolAcknowledge" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.E2setupResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.ResetResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ResetResponse" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 5 }, /* RICsubscriptionResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 4 }, /* RICsubscriptionDeleteResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 3 }, /* RICserviceUpdateAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 2 }, /* RICcontrolAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 1 }, /* E2setupResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 0 } /* ResetResponse */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct SuccessfulOutcomeE2__value), + offsetof(struct SuccessfulOutcomeE2__value, _asn_ctx), + offsetof(struct SuccessfulOutcomeE2__value, present), + sizeof(((struct SuccessfulOutcomeE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 6, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 6, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_SuccessfulOutcomeE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_SuccessfulOutcomeE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_SuccessfulOutcomeE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_SuccessfulOutcomeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SuccessfulOutcomeE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcomeE2_specs_1 = { + sizeof(struct SuccessfulOutcomeE2), + offsetof(struct SuccessfulOutcomeE2, _asn_ctx), + asn_MAP_SuccessfulOutcomeE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcomeE2 = { + "SuccessfulOutcomeE2", + "SuccessfulOutcomeE2", + &asn_OP_SEQUENCE, + asn_DEF_SuccessfulOutcomeE2_tags_1, + sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1[0]), /* 1 */ + asn_DEF_SuccessfulOutcomeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_SuccessfulOutcomeE2_1, + 3, /* Elements count */ + &asn_SPC_SuccessfulOutcomeE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.h b/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.h new file mode 100644 index 000000000..4c408523c --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/SuccessfulOutcomeE2.h @@ -0,0 +1,91 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _SuccessfulOutcomeE2_H_ +#define _SuccessfulOutcomeE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum SuccessfulOutcomeE2__value_PR { + SuccessfulOutcomeE2__value_PR_NOTHING, /* No components present */ + SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse, + SuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteResponse, + SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge, + SuccessfulOutcomeE2__value_PR_RICcontrolAcknowledge, + SuccessfulOutcomeE2__value_PR_E2setupResponse, + SuccessfulOutcomeE2__value_PR_ResetResponse +} SuccessfulOutcomeE2__value_PR; + +/* SuccessfulOutcomeE2 */ +typedef struct SuccessfulOutcomeE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct SuccessfulOutcomeE2__value { + SuccessfulOutcomeE2__value_PR present; + union SuccessfulOutcomeE2__value_u { + RICsubscriptionResponse_t RICsubscriptionResponse; + RICsubscriptionDeleteResponse_t RICsubscriptionDeleteResponse; + RICserviceUpdateAcknowledge_t RICserviceUpdateAcknowledge; + RICcontrolAcknowledge_t RICcontrolAcknowledge; + E2setupResponse_t E2setupResponse; + ResetResponse_t ResetResponse; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SuccessfulOutcomeE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcomeE2; +extern asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcomeE2_specs_1; +extern asn_TYPE_member_t asn_MBR_SuccessfulOutcomeE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _SuccessfulOutcomeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/TimeToWaitE2.c b/src/codec_utils/E2AP_MASTER/TimeToWaitE2.c new file mode 100644 index 000000000..2bccde668 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TimeToWaitE2.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TimeToWaitE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TimeToWaitE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_TimeToWaitE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 5 } /* (0..5,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TimeToWaitE2_value2enum_1[] = { + { 0, 3, "v1s" }, + { 1, 3, "v2s" }, + { 2, 3, "v5s" }, + { 3, 4, "v10s" }, + { 4, 4, "v20s" }, + { 5, 4, "v60s" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_TimeToWaitE2_enum2value_1[] = { + 3, /* v10s(3) */ + 0, /* v1s(0) */ + 4, /* v20s(4) */ + 1, /* v2s(1) */ + 2, /* v5s(2) */ + 5 /* v60s(5) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_TimeToWaitE2_specs_1 = { + asn_MAP_TimeToWaitE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TimeToWaitE2_enum2value_1, /* N => "tag"; sorted by N */ + 6, /* Number of elements in the maps */ + 7, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TimeToWaitE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TimeToWaitE2 = { + "TimeToWaitE2", + "TimeToWaitE2", + &asn_OP_NativeEnumerated, + asn_DEF_TimeToWaitE2_tags_1, + sizeof(asn_DEF_TimeToWaitE2_tags_1) + /sizeof(asn_DEF_TimeToWaitE2_tags_1[0]), /* 1 */ + asn_DEF_TimeToWaitE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TimeToWaitE2_tags_1) + /sizeof(asn_DEF_TimeToWaitE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TimeToWaitE2_constr_1, &asn_PER_type_TimeToWaitE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TimeToWaitE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/TimeToWaitE2.h b/src/codec_utils/E2AP_MASTER/TimeToWaitE2.h new file mode 100644 index 000000000..94fd8ed91 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TimeToWaitE2.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TimeToWaitE2_H_ +#define _TimeToWaitE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TimeToWaitE2 { + TimeToWaitE2_v1s = 0, + TimeToWaitE2_v2s = 1, + TimeToWaitE2_v5s = 2, + TimeToWaitE2_v10s = 3, + TimeToWaitE2_v20s = 4, + TimeToWaitE2_v60s = 5 + /* + * Enumeration is extensible + */ +} e_TimeToWaitE2; + +/* TimeToWaitE2 */ +typedef long TimeToWaitE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_TimeToWaitE2; +asn_struct_free_f TimeToWaitE2_free; +asn_struct_print_f TimeToWaitE2_print; +asn_constr_check_f TimeToWaitE2_constraint; +ber_type_decoder_f TimeToWaitE2_decode_ber; +der_type_encoder_f TimeToWaitE2_encode_der; +xer_type_decoder_f TimeToWaitE2_decode_xer; +xer_type_encoder_f TimeToWaitE2_encode_xer; +oer_type_decoder_f TimeToWaitE2_decode_oer; +oer_type_encoder_f TimeToWaitE2_encode_oer; +per_type_decoder_f TimeToWaitE2_decode_uper; +per_type_encoder_f TimeToWaitE2_encode_uper; +per_type_decoder_f TimeToWaitE2_decode_aper; +per_type_encoder_f TimeToWaitE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TimeToWaitE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.c b/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.c new file mode 100644 index 000000000..38485887e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TriggeringMessageE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TriggeringMessageE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_TriggeringMessageE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TriggeringMessageE2_value2enum_1[] = { + { 0, 18, "initiating-message" }, + { 1, 18, "successful-outcome" }, + { 2, 21, "unsuccessfull-outcome" } +}; +static const unsigned int asn_MAP_TriggeringMessageE2_enum2value_1[] = { + 0, /* initiating-message(0) */ + 1, /* successful-outcome(1) */ + 2 /* unsuccessfull-outcome(2) */ +}; +const asn_INTEGER_specifics_t asn_SPC_TriggeringMessageE2_specs_1 = { + asn_MAP_TriggeringMessageE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TriggeringMessageE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TriggeringMessageE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TriggeringMessageE2 = { + "TriggeringMessageE2", + "TriggeringMessageE2", + &asn_OP_NativeEnumerated, + asn_DEF_TriggeringMessageE2_tags_1, + sizeof(asn_DEF_TriggeringMessageE2_tags_1) + /sizeof(asn_DEF_TriggeringMessageE2_tags_1[0]), /* 1 */ + asn_DEF_TriggeringMessageE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TriggeringMessageE2_tags_1) + /sizeof(asn_DEF_TriggeringMessageE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TriggeringMessageE2_constr_1, &asn_PER_type_TriggeringMessageE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TriggeringMessageE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.h b/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.h new file mode 100644 index 000000000..f480dee65 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TriggeringMessageE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TriggeringMessageE2_H_ +#define _TriggeringMessageE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TriggeringMessageE2 { + TriggeringMessageE2_initiating_message = 0, + TriggeringMessageE2_successful_outcome = 1, + TriggeringMessageE2_unsuccessfull_outcome = 2 +} e_TriggeringMessageE2; + +/* TriggeringMessageE2 */ +typedef long TriggeringMessageE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TriggeringMessageE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TriggeringMessageE2; +extern const asn_INTEGER_specifics_t asn_SPC_TriggeringMessageE2_specs_1; +asn_struct_free_f TriggeringMessageE2_free; +asn_struct_print_f TriggeringMessageE2_print; +asn_constr_check_f TriggeringMessageE2_constraint; +ber_type_decoder_f TriggeringMessageE2_decode_ber; +der_type_encoder_f TriggeringMessageE2_encode_der; +xer_type_decoder_f TriggeringMessageE2_decode_xer; +xer_type_encoder_f TriggeringMessageE2_encode_xer; +oer_type_decoder_f TriggeringMessageE2_decode_oer; +oer_type_encoder_f TriggeringMessageE2_encode_oer; +per_type_decoder_f TriggeringMessageE2_decode_uper; +per_type_encoder_f TriggeringMessageE2_encode_uper; +per_type_decoder_f TriggeringMessageE2_decode_aper; +per_type_encoder_f TriggeringMessageE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TriggeringMessageE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.c b/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.c new file mode 100644 index 000000000..d1d30e909 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TypeOfErrorE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TypeOfErrorE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_TypeOfErrorE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TypeOfErrorE2_value2enum_1[] = { + { 0, 14, "not-understood" }, + { 1, 7, "missing" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_TypeOfErrorE2_enum2value_1[] = { + 1, /* missing(1) */ + 0 /* not-understood(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_TypeOfErrorE2_specs_1 = { + asn_MAP_TypeOfErrorE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TypeOfErrorE2_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TypeOfErrorE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TypeOfErrorE2 = { + "TypeOfErrorE2", + "TypeOfErrorE2", + &asn_OP_NativeEnumerated, + asn_DEF_TypeOfErrorE2_tags_1, + sizeof(asn_DEF_TypeOfErrorE2_tags_1) + /sizeof(asn_DEF_TypeOfErrorE2_tags_1[0]), /* 1 */ + asn_DEF_TypeOfErrorE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TypeOfErrorE2_tags_1) + /sizeof(asn_DEF_TypeOfErrorE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TypeOfErrorE2_constr_1, &asn_PER_type_TypeOfErrorE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TypeOfErrorE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.h b/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.h new file mode 100644 index 000000000..57508d5ea --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/TypeOfErrorE2.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TypeOfErrorE2_H_ +#define _TypeOfErrorE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TypeOfErrorE2 { + TypeOfErrorE2_not_understood = 0, + TypeOfErrorE2_missing = 1 + /* + * Enumeration is extensible + */ +} e_TypeOfErrorE2; + +/* TypeOfErrorE2 */ +typedef long TypeOfErrorE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TypeOfErrorE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TypeOfErrorE2; +extern const asn_INTEGER_specifics_t asn_SPC_TypeOfErrorE2_specs_1; +asn_struct_free_f TypeOfErrorE2_free; +asn_struct_print_f TypeOfErrorE2_print; +asn_constr_check_f TypeOfErrorE2_constraint; +ber_type_decoder_f TypeOfErrorE2_decode_ber; +der_type_encoder_f TypeOfErrorE2_encode_der; +xer_type_decoder_f TypeOfErrorE2_decode_xer; +xer_type_encoder_f TypeOfErrorE2_encode_xer; +oer_type_decoder_f TypeOfErrorE2_decode_oer; +oer_type_encoder_f TypeOfErrorE2_encode_oer; +per_type_decoder_f TypeOfErrorE2_decode_uper; +per_type_encoder_f TypeOfErrorE2_encode_uper; +per_type_decoder_f TypeOfErrorE2_decode_aper; +per_type_encoder_f TypeOfErrorE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TypeOfErrorE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.c b/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.c new file mode 100644 index 000000000..a394f12c1 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.c @@ -0,0 +1,358 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "UnsuccessfulOutcomeE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_UnsuccessfulOutcomeE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_UnsuccessfulOutcomeE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 2; /* &UnsuccessfulOutcomeE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICsubscriptionFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICsubscriptionDeleteFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICserviceUpdateFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdateFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICcontrolFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.E2setupFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupFailure" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 4 }, /* RICsubscriptionFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 3 }, /* RICsubscriptionDeleteFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 2 }, /* RICserviceUpdateFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 1 }, /* RICcontrolFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 0 } /* E2setupFailure */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct UnsuccessfulOutcomeE2__value), + offsetof(struct UnsuccessfulOutcomeE2__value, _asn_ctx), + offsetof(struct UnsuccessfulOutcomeE2__value, present), + sizeof(((struct UnsuccessfulOutcomeE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 5, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 5, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_UnsuccessfulOutcomeE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_UnsuccessfulOutcomeE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_UnsuccessfulOutcomeE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_UnsuccessfulOutcomeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_UnsuccessfulOutcomeE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcomeE2_specs_1 = { + sizeof(struct UnsuccessfulOutcomeE2), + offsetof(struct UnsuccessfulOutcomeE2, _asn_ctx), + asn_MAP_UnsuccessfulOutcomeE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcomeE2 = { + "UnsuccessfulOutcomeE2", + "UnsuccessfulOutcomeE2", + &asn_OP_SEQUENCE, + asn_DEF_UnsuccessfulOutcomeE2_tags_1, + sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1[0]), /* 1 */ + asn_DEF_UnsuccessfulOutcomeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_UnsuccessfulOutcomeE2_1, + 3, /* Elements count */ + &asn_SPC_UnsuccessfulOutcomeE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.h b/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.h new file mode 100644 index 000000000..b437ded74 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/UnsuccessfulOutcomeE2.h @@ -0,0 +1,89 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _UnsuccessfulOutcomeE2_H_ +#define _UnsuccessfulOutcomeE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum UnsuccessfulOutcomeE2__value_PR { + UnsuccessfulOutcomeE2__value_PR_NOTHING, /* No components present */ + UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure, + UnsuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteFailure, + UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure, + UnsuccessfulOutcomeE2__value_PR_RICcontrolFailure, + UnsuccessfulOutcomeE2__value_PR_E2setupFailure +} UnsuccessfulOutcomeE2__value_PR; + +/* UnsuccessfulOutcomeE2 */ +typedef struct UnsuccessfulOutcomeE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct UnsuccessfulOutcomeE2__value { + UnsuccessfulOutcomeE2__value_PR present; + union UnsuccessfulOutcomeE2__value_u { + RICsubscriptionFailure_t RICsubscriptionFailure; + RICsubscriptionDeleteFailure_t RICsubscriptionDeleteFailure; + RICserviceUpdateFailure_t RICserviceUpdateFailure; + RICcontrolFailure_t RICcontrolFailure; + E2setupFailure_t E2setupFailure; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} UnsuccessfulOutcomeE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcomeE2; +extern asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcomeE2_specs_1; +extern asn_TYPE_member_t asn_MBR_UnsuccessfulOutcomeE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _UnsuccessfulOutcomeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_MASTER/asn_constant.h b/src/codec_utils/E2AP_MASTER/asn_constant.h new file mode 100644 index 000000000..a6f348cc3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/asn_constant.h @@ -0,0 +1,22 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + */ + +#ifndef _ASN_CONSTANT_H +#define _ASN_CONSTANT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define maxProtocolIEs (65535) +#define maxnoofErrors (256) +#define maxofRANfunctionID (256) +#define maxofRICactionID (16) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ASN_CONSTANT_H */ diff --git a/src/codec_utils/E2AP_MASTER/constr_CHOICE.c b/src/codec_utils/E2AP_MASTER/constr_CHOICE.c new file mode 100644 index 000000000..86dcbb030 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_CHOICE.c @@ -0,0 +1,1533 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static unsigned _fetch_present_idx(const void *struct_ptr, unsigned off, + unsigned size); +static void _set_present_idx(void *sptr, unsigned offset, unsigned size, + unsigned pres); +static const void *_get_member_ptr(const asn_TYPE_descriptor_t *, + const void *sptr, asn_TYPE_member_t **elm, + unsigned *present); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +asn_dec_rval_t +CHOICE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || td->tags_count) { + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, -1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn_TYPE_member_t *elm;/* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, LEFT, elm->tag_mode); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || td->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + td->name); + RETURN(RC_FAIL); + } + + /* UNREACHABLE */ + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +asn_enc_rval_t +CHOICE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval = {0,0,0}; + const void *memb_ptr; + size_t computed_size = 0; + unsigned present; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + ASN__ENCODE_FAILED; + } + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + if(elm->optional) { + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || td->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, + cb, app_key); + if(ret == -1) + ASN__ENCODE_FAILED; + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 && present <= td->elements_count) { + const asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); + } else { + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); + } + + return asn_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return (ber_tlv_tag_t)-1; + } +} + +int +CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + return 0; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + return elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: no CHOICE element given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +CHOICE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value of a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag. + * Phase 4: Skipping unknown extensions. + * Phase 5: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 4;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + unsigned old_present; + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Start/Continue decoding the inner member */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); + old_present = _fetch_present_idx(st, + specs->pres_offset, specs->pres_size); + assert(old_present == 0 || old_present == edx + 1); + /* Record what we've got */ + _set_present_idx(st, + specs->pres_offset, specs->pres_size, edx + 1); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 3; + /* Fall through */ + } + + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); + + /* Skip the extensions section */ + if(ctx->phase == 4) { + ASN_DEBUG("skip_unknown(%d, %ld)", + tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 5; + RETURN(RC_FAIL); + case 1: + ctx->phase = 3; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); + continue; + case 2: + ctx->phase = 3; + break; + } + } + + switch(tcv) { + case XCT_BOTH: + break; /* No CHOICE? */ + case XCT_CLOSING: + if(ctx->phase != 3) + break; + XER_ADVANCE(ch_size); + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which inner member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr,ch_size,elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx != td->elements_count) + continue; + + /* It is expected extension */ + if(specs->ext_start != -1) { + ASN_DEBUG("Got anticipated extension"); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + ctx->phase = 3; /* Terminating */ + } else { + ctx->left = 1; + ctx->phase = 4; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); + break; + } + + ctx->phase = 5; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + +asn_enc_rval_t +CHOICE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + unsigned present = 0; + + if(!sptr) + ASN__ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present == 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr = NULL; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_dec_rval_t +CHOICE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) { + ASN_DEBUG("CHOICE presence from wire %d", value); + value = specs->from_canonical_order[value]; + ASN_DEBUG("CHOICE presence index effective %d", value); + } + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + if(ct && ct->range_bits >= 0) { + if(present_enc < ct->lower_bound + || present_enc > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG( + "CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 0, 1)) + ASN__ENCODE_FAILED; + } + + + elm = &td->elements[present]; + ASN_DEBUG("CHOICE member \"%s\" %d (as %d)", elm->name, present, + present_enc); + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) ASN__ENCODE_FAILED; + if(uper_put_nsnnwn(po, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +asn_dec_rval_t +CHOICE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + const asn_per_constraint_t *ext_ct = NULL; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) { + ext_ct = ct; + ct = 0; /* Not restricted */ + } + } + + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = aper_get_nsnnwn(pd, ext_ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) + value = specs->from_canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct = NULL; + const asn_per_constraint_t *ext_ct = NULL; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE using ALIGNED PER", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = NULL; + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || (unsigned)present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + if(ct && (ct->range_bits >= 0)) { + // Value is not within the range of the primary values ? + if(present < ct->lower_bound || present > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + // X691/23.5 Extension marker = 1 + if(per_put_few_bits(po, 1, 1)) { + ASN__ENCODE_FAILED; + } + } else { + ASN__ENCODE_FAILED; + } + // no more need of constraint. + ext_ct = ct; + ct = NULL; + } + } + + if(ct && (ct->flags & APC_EXTENSIBLE)) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present, ct->lower_bound, ct->upper_bound); + // X691.23.5 Extension marker = 0 + if(per_put_few_bits(po, 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && (ct->range_bits >= 0)) { + // By construction (ct != 0), the alternative value is a non extended one. + // X691/23.7 X691/23.6 alternative value encoded as a range_bits bits value. + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) + ASN__ENCODE_FAILED; + // X691/23.8 normally encoded as a small non negative whole number + + if(ext_ct && aper_put_nsnnwn(po, ext_ct->range_bits, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +int +CHOICE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Print that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + } + + return elm->type->op->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static unsigned +_fetch_present_idx(const void *struct_ptr, unsigned pres_offset, + unsigned pres_size) { + const void *present_ptr; + unsigned present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const unsigned int *)present_ptr; break; + case sizeof(short): present = *(const unsigned short *)present_ptr; break; + case sizeof(char): present = *(const unsigned char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static void +_set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size, + unsigned present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(unsigned int *)present_ptr = present; break; + case sizeof(short): *(unsigned short *)present_ptr = present; break; + case sizeof(char): *(unsigned char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} + +static const void * +_get_member_ptr(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_TYPE_member_t **elm_ptr, unsigned *present_out) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + *elm_ptr = NULL; + *present_out = 0; + return NULL; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + *present_out = present; + + /* + * The presence index is intentionally 1-based to avoid + * treating zeroed structure as a valid one. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *const elm = &td->elements[present - 1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + *elm_ptr = elm; + return memb_ptr; + } else { + *elm_ptr = NULL; + return NULL; + } + +} + +int +CHOICE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + asn_TYPE_member_t *aelm; + asn_TYPE_member_t *belm; + unsigned apresent = 0; + unsigned bpresent = 0; + const void *amember = _get_member_ptr(td, aptr, &aelm, &apresent); + const void *bmember = _get_member_ptr(td, bptr, &belm, &bpresent); + + if(amember && bmember) { + if(apresent == bpresent) { + assert(aelm == belm); + return aelm->type->op->compare_struct(aelm->type, amember, bmember); + } else if(apresent < bpresent) { + return -1; + } else { + return 1; + } + } else if(!amember) { + return -1; + } else { + return 1; + } +} + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned +CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, const void *sptr) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + return _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); +} + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int +CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr, + unsigned present) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned old_present; + + if(!sptr) { + return -1; + } + + if(present > td->elements_count) + return -1; + + old_present = + _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + if(present == old_present) + return 0; + + if(old_present != 0) { + assert(old_present <= td->elements_count); + ASN_STRUCT_RESET(*td, sptr); + } + + _set_present_idx(sptr, specs->pres_offset, specs->pres_size, present); + + return 0; +} + + +asn_random_fill_result_t +CHOICE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_random_fill_result_t res; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm; + unsigned present; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *st = *sptr; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + present = asn_random_between(1, td->elements_count); + elm = &td->elements[present - 1]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + res = elm->type->op->random_fill(elm->type, memb_ptr2, + &elm->encoding_constraints, max_length); + _set_present_idx(st, specs->pres_offset, specs->pres_size, present); + if(res.code == ARFILL_OK) { + *sptr = st; + } else { + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + } + + return res; +} + + +asn_TYPE_operation_t asn_OP_CHOICE = { + CHOICE_free, + CHOICE_print, + CHOICE_compare, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + CHOICE_decode_oer, + CHOICE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + CHOICE_decode_uper, + CHOICE_encode_uper, + CHOICE_decode_aper, + CHOICE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + CHOICE_random_fill, + CHOICE_outmost_tag +}; diff --git a/src/codec_utils/E2AP_MASTER/constr_CHOICE.h b/src/codec_utils/E2AP_MASTER/constr_CHOICE.h new file mode 100644 index 000000000..a1999edc4 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_CHOICE.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_CHOICE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_codec_ctx_t member */ + unsigned pres_offset; /* Identifier of the present member */ + unsigned pres_size; /* Size of the identifier (enum) */ + + /* + * Tags to members mapping table. + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* Canonical ordering of CHOICE elements, for PER */ + const unsigned *to_canonical_order; + const unsigned *from_canonical_order; + + /* + * Extensions-related stuff. + */ + signed ext_start; /* First member of extensions, or -1 */ +} asn_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; +asn_struct_compare_f CHOICE_compare; +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; +xer_type_encoder_f CHOICE_encode_xer; +oer_type_decoder_f CHOICE_decode_oer; +oer_type_encoder_f CHOICE_encode_oer; +per_type_decoder_f CHOICE_decode_uper; +per_type_encoder_f CHOICE_encode_uper; +per_type_decoder_f CHOICE_decode_aper; +per_type_encoder_f CHOICE_encode_aper; +asn_outmost_tag_f CHOICE_outmost_tag; +asn_random_fill_f CHOICE_random_fill; +extern asn_TYPE_operation_t asn_OP_CHOICE; + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, + const void *structure_ptr); + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, + void *structure_ptr, unsigned present); + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/constr_CHOICE_oer.c b/src/codec_utils/E2AP_MASTER/constr_CHOICE_oer.c new file mode 100644 index 000000000..a4c591c8e --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_CHOICE_oer.c @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val & 0x3F) != 0x3F) { + /* #8.7.1 */ + *tag_r = ((val & 0x3F) << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + +asn_dec_rval_t +CHOICE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + (void)constraints; + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + switch(ctx->phase) { + case 0: { + /* + * Discover the tag. + */ + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + + tag_len = oer_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case 0: + ASN__DECODE_STARVED; + case -1: + ASN__DECODE_FAILED; + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + + t2m = (const asn_TYPE_tag2member_t *)bsearch( + &key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG( + "Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip open type extension */ + ASN_DEBUG( + "Not implemented skipping open type extension for tag %s", + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + } while(0); + + + ADVANCE(tag_len); + } + /* Fall through */ + case 1: { + asn_TYPE_member_t *elm = &elements[ctx->step]; /* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_dec_rval_t rval = {0,0}; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Set presence to be able to free it properly at any time */ + (void)CHOICE_variant_set_presence(td, st, ctx->step + 1); + + if(specs->ext_start >= 0 && specs->ext_start <= ctx->step) { + ssize_t got = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + if(got < 0) ASN__DECODE_FAILED; + if(got == 0) ASN__DECODE_STARVED; + rval.code = RC_OK; + rval.consumed = got; + } else { + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + rval.consumed += consumed_myself; + switch(rval.code) { + case RC_OK: + NEXT_PHASE(ctx); + case RC_WMORE: + break; + case RC_FAIL: + SET_PHASE(ctx, 3); /* => 3 */ + } + return rval; + } + case 2: + /* Already decoded everything */ + RETURN(RC_OK); + case 3: + /* Failed to decode, after all */ + RETURN(RC_FAIL); + } + + RETURN(RC_FAIL); +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_put_tag(ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + + if(tval < 0x3F) { + uint8_t b = (uint8_t)((tclass << 6) | tval); + if(cb(&b, 1, app_key) < 0) { + return -1; + } + return 1; + } else { + uint8_t buf[1 + 2 * sizeof(tval)]; + uint8_t *b = &buf[sizeof(buf)-1]; /* Last addressable */ + size_t encoded; + for(; ; tval >>= 7) { + if(tval >> 7) { + *b-- = 0x80 | (tval & 0x7f); + } else { + *b-- = tval & 0x7f; + break; + } + } + *b = (uint8_t)((tclass << 6) | 0x3F); + encoded = sizeof(buf) - (b - buf); + if(cb(b, encoded, app_key) < 0) { + return -1; + } + return encoded; + } + +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +CHOICE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + unsigned present; + const void *memb_ptr; + ber_tlv_tag_t tag; + ssize_t tag_len; + asn_enc_rval_t er = {0, 0, 0}; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("OER %s encoding as CHOICE", td->name); + + present = CHOICE_variant_get_presence(td, sptr); + if(present == 0 || present > td->elements_count) { + ASN_DEBUG("CHOICE %s member is not selected", td->name); + ASN__ENCODE_FAILED; + } + + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + tag = asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); + if(tag == 0) { + ASN__ENCODE_FAILED; + } + + tag_len = oer_put_tag(tag, cb, app_key); + if(tag_len < 0) { + ASN__ENCODE_FAILED; + } + + if(specs->ext_start >= 0 && (unsigned)specs->ext_start <= (present-1)) { + ssize_t encoded = oer_open_type_put(elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(encoded < 0) ASN__ENCODE_FAILED; + er.encoded = tag_len + encoded; + } else { + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded >= 0) er.encoded += tag_len; + } + + return er; +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.c b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.c new file mode 100644 index 000000000..43dcac70b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.c @@ -0,0 +1,2059 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) { + if(a->el_no > b->el_no) + return 1; + /* + * Important: we do not check + * for a->el_no <= b->el_no! + */ + return 0; + } else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = ((size_t)ctx->step >> 1); edx < td->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + size_t opt_edx_end; /* Next non-optional element */ + size_t n; + int use_bsearch; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%" ASN_PRI_SIZE " flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx))) { + ASN_DEBUG("End of SEQUENCE %s", td->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("Current tag in %s SEQUENCE for element %" ASN_PRI_SIZE " " + "(%s) is %s encoded in %d bytes, of frame %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } else if(((const uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %" ASN_PRI_SIZE ", opt = %d, ec=%d", edx, + elements[edx].optional, td->elements_count); + if((edx + elements[edx].optional == td->elements_count) + || IN_EXTENSION_GROUP(specs, edx)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + + /* + * Find the next available type with this tag. + */ + use_bsearch = 0; + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ + else if(opt_edx_end - edx > 8) { + /* Limit the scope of linear search... */ + opt_edx_end = edx + 8; + use_bsearch = 1; + /* ... and resort to bsearch() */ + } + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].flags & ATF_ANY_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; + break; + } + } + if(use_bsearch) { + /* + * Resort to a binary search over + * sorted array of tags. + */ + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + key.el_no = edx; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + const asn_TYPE_tag2member_t *best = 0; + const asn_TYPE_tag2member_t *t2m_f, *t2m_l; + size_t edx_max = edx + elements[edx].optional; + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + } + n = opt_edx_end; + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + if(!IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Unexpected tag %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + ASN_DEBUG("Expected tag %s (%s)%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + edx += elements[edx].optional; + + ASN_DEBUG("Skipping unexpected %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, td->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + if(elements[edx].flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_ber_get(opt_codec_ctx, td, st, &elements[edx], ptr, LEFT); + } else { + rval = elements[edx].type->op->ber_decoder(opt_codec_ctx, + elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + } + ASN_DEBUG("In %s SEQUENCE decoded %" ASN_PRI_SIZE " %s of %d " + "in %d bytes rval.code %d, size=%d", + td->name, edx, elements[edx].type->name, + (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + /* Fall through */ + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + td->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, td->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + td->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + + +/* + * The DER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t computed_size = 0; + asn_enc_rval_t erval = {0,0,0}; + ssize_t ret; + size_t edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + erval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) + ASN__ENCODE_FAILED; + erval.encoded = computed_size + ret; + + if(!cb) ASN__ENCODED_OK(erval); + + /* + * Encode all members. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval = {0,0,0}; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + tmperval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s of SEQUENCE %s encoded in %ld bytes", + edx, elm->name, td->name, (long)tmperval.encoded); + } + + if(computed_size != 0) + /* + * Encoded size is not equal to the computed size. + */ + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(erval); +} + + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) \ + do { \ + size_t num = (num_bytes); \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SEQUENCE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Skipping unknown extensions. + * Phase 4: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 3;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the inner member of a sequence. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr_dontuse; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr_dontuse = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr_dontuse; /* Only use of memb_ptr_dontuse */ + } + + if(elm->flags & ATF_OPEN_TYPE) { + tmprval = OPEN_TYPE_xer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + /* Invoke the inner type decoder, m.b. multiple times */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + ptr, size); + } + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; /* Back to body processing */ + ctx->step = ++edx; + ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", + ctx->phase, ctx->step); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", + tcv, ctx->phase, xml_tag); + + /* Skip the extensions section */ + if(ctx->phase == 3) { + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 4; + RETURN(RC_FAIL); + case 0: + XER_ADVANCE(ch_size); + continue; + case 1: + XER_ADVANCE(ch_size); + ctx->phase = 1; + continue; + case 2: + ctx->phase = 1; + break; + } + } + + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx)) { + XER_ADVANCE(ch_size); + ctx->phase = 4; /* Phase out */ + RETURN(RC_OK); + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%" ASN_PRI_SIZE "", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { + break; /* Really unexpected */ + } + + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + size_t n; + size_t edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(ptr, ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %" ASN_PRI_SIZE "/%u", + edx, td->elements_count); + } + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %" ASN_PRI_SIZE "", + edx); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + } else { + ctx->left = 1; + ctx->phase = 3; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", + size>0?((const char *)ptr)[0]:'.', + size>1?((const char *)ptr)[1]:'.', + size>2?((const char *)ptr)[2]:'.', + size>3?((const char *)ptr)[3]:'.', + size>4?((const char *)ptr)[4]:'.', + size>5?((const char *)ptr)[5]:'.'); + break; + } + + ctx->phase = 4; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + +asn_enc_rval_t +SEQUENCE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + int xcan = (flags & XER_F_CANONICAL); + asn_TYPE_descriptor_t *tmp_def_val_td = 0; + void *tmp_def_val = 0; + size_t edx; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + assert(tmp_def_val == 0); + if(elm->default_value_set) { + if(elm->default_value_set(&tmp_def_val)) { + ASN__ENCODE_FAILED; + } else { + memb_ptr = tmp_def_val; + tmp_def_val_td = elm->type; + } + } else if(elm->optional) { + continue; + } else { + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmp_def_val) { + ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + tmp_def_val = 0; + } + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + if(tmp_def_val) ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + ASN__ENCODE_FAILED; +} + +int +SEQUENCE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t edx; + int ret; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Print line */ + /* Fall through */ + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + _i_INDENT(1); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + + /* Print the member itself */ + ret = elm->type->op->print_struct(elm->type, memb_ptr, ilevel + 1, + cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, + enum asn_struct_free_method method) { + size_t edx; + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_struct_ctx_t *ctx; /* Decoder context */ + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + /* Clean parsing context */ + ctx = (asn_struct_ctx_t *)((char *)sptr + specs->ctx_offset); + FREEMEM(ctx->ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(sptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset( + sptr, 0, + ((const asn_SEQUENCE_specifics_t *)(td->specifics))->struct_size); + break; + } +} + +int +SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t edx; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + int ret = elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + if(ret) return ret; + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SEQUENCE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; + edx < (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_uper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = uper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, (long)bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, + *memb_ptr2); + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + ASN_DEBUG("Skipped overflow extension"); + continue; + } + break; + } + + FREEMEM(epres); + } + + if(specs->first_extension >= 0) { + unsigned i; + /* Fill DEFAULT members in extensions */ + for(i = specs->roms_count; i < specs->roms_count + specs->aoms_count; + i++) { + asn_TYPE_member_t *elm; + void **memb_ptr2; /* Pointer to member pointer */ + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE__handle_extensions(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s:%s (@%" ASN_PRI_SIZE ") present => %d", elm->name, + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) { + return -1; + } + /* Encode as open type field */ + if(po2 && present + && uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + *memb_ptr2, po2)) + return -1; + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE__handle_extensions(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(*memb_ptr2) == 0) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + ASN_DEBUG("Encoding %s->%s:%s", td->name, elm->name, elm->type->name); + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, *memb_ptr2, + po); + if(er.encoded == -1) return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of extensions %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE__handle_extensions(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE__handle_extensions(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +SEQUENCE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (APER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ +#if 0 + int padding; +#endif + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } +#if 0 + /* Get Padding */ + padding = (8 - (pd->moved % 8)) % 8; + if(padding > 0) + ASN_DEBUG("For element %s,offset= %ld Padding bits = %d", td->name, pd->moved, padding); +#if 0 /* old way of removing padding */ + per_get_few_bits(pd, padding); +#else /* Experimental fix proposed by @mhanna123 */ + if(edx != (td->elements_count-1)) + per_get_few_bits(pd, padding); + else { + if(specs->roms_count && (padding > 0)) + ASN_DEBUG(">>>>> not skipping padding of %d bits for element:%ld out of %d", padding, edx, td->elements_count); + else + per_get_few_bits(pd, padding); + } +#endif /* dealing with padding */ +#endif + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_aper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = aper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) + ASN__DECODE_STARVED; + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%ld is not extension", edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: + break; + case 0: + continue; + default: + if(aper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + } + break; + } + + FREEMEM(epres); + } + + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE_handle_extensions_aper(const asn_TYPE_descriptor_t *td, + const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%s (@%ld) is not extension", elm->type->name, edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s (@%ld) present => %d", + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && aper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (APER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE_handle_extensions_aper(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr2) == 1) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %ld not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(memb_ptr2) == 1) + continue; + + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); + er = elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + *memb_ptr2, po); + if(er.encoded == -1) + return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(aper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions_aper(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions_aper(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + size_t edx; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *amemb; + const void *bmemb; + int ret; + + if(elm->flags & ATF_POINTER) { + amemb = + *(const void *const *)((const char *)aptr + elm->memb_offset); + bmemb = + *(const void *const *)((const char *)bptr + elm->memb_offset); + if(!amemb) { + if(!bmemb) continue; + if(elm->default_value_cmp + && elm->default_value_cmp(bmemb) == 0) { + /* A is absent, but B is present and equal to DEFAULT */ + continue; + } + return -1; + } else if(!bmemb) { + if(elm->default_value_cmp + && elm->default_value_cmp(amemb) == 0) { + /* B is absent, but A is present and equal to DEFAULT */ + continue; + } + return 1; + } + } else { + amemb = (const void *)((const char *)aptr + elm->memb_offset); + bmemb = (const void *)((const char *)bptr + elm->memb_offset); + } + + ret = elm->type->op->compare_struct(elm->type, amemb, bmemb); + if(ret != 0) return ret; + } + + return 0; +} + +asn_TYPE_operation_t asn_OP_SEQUENCE = { + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_compare, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_decode_oer, + SEQUENCE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + SEQUENCE_decode_aper, + SEQUENCE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SEQUENCE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + void *st = *sptr; + size_t edx; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + for(edx = 0; edx < td->elements_count; edx++) { + const asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_random_fill_result_t tmpres; + + if(elm->optional && asn_random_between(0, 4) == 2) { + /* Sometimes decide not to fill the optional value */ + continue; + } + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + tmpres = elm->type->op->random_fill( + elm->type, memb_ptr2, &elm->encoding_constraints, + max_length > result_ok.length ? max_length - result_ok.length : 0); + switch(tmpres.code) { + case ARFILL_OK: + result_ok.length += tmpres.length; + continue; + case ARFILL_SKIPPED: + assert(!(elm->flags & ATF_POINTER) || *memb_ptr2 == NULL); + continue; + case ARFILL_FAILED: + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + return tmpres; + } + } + + *sptr = st; + + return result_ok; +} + diff --git a/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.h b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.h new file mode 100644 index 000000000..a22ed3a27 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* + * Tags to members mapping table (sorted). + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + const int *oms; /* Optional MemberS */ + unsigned roms_count; /* Root optional members count */ + unsigned aoms_count; /* Additions optional members count */ + + /* + * Description of an extensions group. + * Root components are clustered at the beginning of the structure, + * whereas extensions are clustered at the end. -1 means not extensible. + */ + signed first_extension; /* First extension addition */ +} asn_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; +asn_struct_compare_f SEQUENCE_compare; +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; +xer_type_encoder_f SEQUENCE_encode_xer; +oer_type_decoder_f SEQUENCE_decode_oer; +oer_type_encoder_f SEQUENCE_encode_oer; +per_type_decoder_f SEQUENCE_decode_uper; +per_type_encoder_f SEQUENCE_encode_uper; +per_type_decoder_f SEQUENCE_decode_aper; +per_type_encoder_f SEQUENCE_encode_aper; +asn_random_fill_f SEQUENCE_random_fill; +extern asn_TYPE_operation_t asn_OP_SEQUENCE; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.c b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.c new file mode 100644 index 000000000..10f18cf46 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.c @@ -0,0 +1,358 @@ +/*- + * Copyright (c) 2003, 2004, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The DER encoder of the SEQUENCE OF type. + */ +asn_enc_rval_t +SEQUENCE_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(ptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + asn_enc_rval_t erval = {0,0,0}; + int edx; + + ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + computed_size += encoding_size; + if(!cb) { + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + cb, app_key); + if(erval.encoded == -1) + return erval; + encoding_size += erval.encoded; + } + + if(computed_size != (size_t)encoding_size) { + /* + * Encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + erval.structure_ptr = 0; + erval.failed_type = 0; + } + + return erval; +} + +asn_enc_rval_t +SEQUENCE_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 + : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + if(!xcan) ASN__TEXT_INDENT(1, ilevel + 1); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_enc_rval_t +SEQUENCE_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + const asn_TYPE_member_t *elm = td->elements; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, + po); + if(er.encoded == -1) ASN__ENCODE_FAILED; + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + ASN__ENCODED_OK(er); +} + +asn_enc_rval_t +SEQUENCE_OF_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + asn_TYPE_member_t *elm = td->elements; + int seq; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF size (%d) using ALIGNED PER", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = (list->count < ct->lower_bound + || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", + ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) + ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) + ASN__ENCODE_FAILED; + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ +/* if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; +*/ + if (aper_put_length(po, ct->upper_bound - ct->lower_bound + 1, list->count - ct->lower_bound) < 0) + ASN__ENCODE_FAILED; + } + + for(seq = -1; seq < list->count;) { + ssize_t mayEncode; + if(seq < 0) seq = 0; + if(ct && ct->effective_bits >= 0) { + mayEncode = list->count; + } else { + mayEncode = aper_put_length(po, -1, list->count - seq); + if(mayEncode < 0) ASN__ENCODE_FAILED; + } + + while(mayEncode--) { + void *memb_ptr = list->array[seq++]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->aper_encoder(elm->type, + elm->encoding_constraints.per_constraints, memb_ptr, po); + if(er.encoded == -1) + ASN__ENCODE_FAILED; + } + } + + ASN__ENCODED_OK(er); +} +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_sequence_ *a = _A_CSEQUENCE_FROM_VOID(aptr); + const asn_anonymous_sequence_ *b = _A_CSEQUENCE_FROM_VOID(bptr); + ssize_t idx; + + if(a && b) { + ssize_t common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, a->array[idx], b->array[idx]); + if(ret) return ret; + } + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_compare, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ + SEQUENCE_OF_encode_oer, /* Same as SET OF encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_OF_decode_uper, /* Same as SET OF decoder */ + SEQUENCE_OF_encode_uper, + SEQUENCE_OF_decode_aper, + SEQUENCE_OF_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + diff --git a/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.h b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.h new file mode 100644 index 000000000..6857f0f0c --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_OF.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_OF_H_ +#define _CONSTR_SEQUENCE_OF_H_ + +#include +#include /* Implemented using SET OF */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * A set specialized functions dealing with the SEQUENCE OF type. + * Generally implemented using SET OF. + */ +asn_struct_compare_f SEQUENCE_OF_compare; +der_type_encoder_f SEQUENCE_OF_encode_der; +xer_type_encoder_f SEQUENCE_OF_encode_xer; +per_type_encoder_f SEQUENCE_OF_encode_uper; +per_type_encoder_f SEQUENCE_OF_encode_aper; +extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; + +#define SEQUENCE_OF_free SET_OF_free +#define SEQUENCE_OF_print SET_OF_print +#define SEQUENCE_OF_constraint SET_OF_constraint +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber +#define SEQUENCE_OF_decode_xer SET_OF_decode_xer +#define SEQUENCE_OF_decode_oer SET_OF_decode_oer +#define SEQUENCE_OF_encode_oer SET_OF_encode_oer +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper +#define SEQUENCE_OF_decode_aper SET_OF_decode_aper +#define SEQUENCE_OF_random_fill SET_OF_random_fill + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_oer.c b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_oer.c new file mode 100644 index 000000000..ecb589cc3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SEQUENCE_oer.c @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +#define IN_ROOT_GROUP_PRED(edx) \ + edx < (specs->first_extension < 0 ? td->elements_count \ + : (size_t)specs->first_extension) + +#define FOR_IN_ROOT_GROUP(edx) for(edx = 0; IN_ROOT_GROUP_PRED(edx); edx++) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Return pointer to a member. + */ +static void ** +element_ptrptr(void *struct_ptr, asn_TYPE_member_t *elm, void **tmp_save_ptr) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return (void **)((char *)struct_ptr + elm->memb_offset); + } else { + assert(tmp_save_ptr); + *tmp_save_ptr = (void *)((char *)struct_ptr + elm->memb_offset); + return tmp_save_ptr; + } +} + +static const void * +element_ptr(const void *struct_ptr, const asn_TYPE_member_t *elm) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return *(const void *const *)((const char *)struct_ptr + + elm->memb_offset); + } else { + return (const void *)((const char *)struct_ptr + elm->memb_offset); + } +} + +asn_dec_rval_t +SEQUENCE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch preamble. + */ + asn_bit_data_t *preamble; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + size_t preamble_bytes = ((7 + preamble_bits) >> 3); + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 0", td->name); + + ASN_DEBUG( + "Expecting preamble bits %" ASN_PRI_SIZE " for %s (including %d extension bits)", + preamble_bits, td->name, has_extensions_bit); + + if(preamble_bytes > size) { + ASN__DECODE_STARVED; + } + + preamble = asn_bit_data_new_contiguous(ptr, preamble_bits); + if(!preamble) { + RETURN(RC_FAIL); + } + preamble->nboff = has_extensions_bit; + ctx->ptr = preamble; + ADVANCE(preamble_bytes); + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_bit_data_t *preamble = ctx->ptr; + size_t edx; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 1 (Root)", td->name); + + assert(preamble); + + for(edx = (ctx->step >> 1); IN_ROOT_GROUP_PRED(edx); + edx++, ctx->step = (ctx->step & ~1) + 2) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + ASN_DEBUG("Decoding %s->%s", td->name, elm->name); + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + if(ctx->step & 1) { + goto microphase2_decode_continues; + } + + + if(elm->optional) { + int32_t present = asn_get_few_bits(preamble, 1); + if(present < 0) { + ASN_DEBUG("Presence map ended prematurely: %d", present); + RETURN(RC_FAIL); + } else if(present == 0) { + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + void *tmp; + if(elm->default_value_set( + element_ptrptr(st, elm, &tmp))) { + RETURN(RC_FAIL); + } + } + /* The member is not present. */ + continue; + } + /* Present OPTIONAL or DEFAULT component. */ + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2_decode_continues: + if(elm->flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_oer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + void *save_memb_ptr; /* Temporary reference. */ + void **memb_ptr2; /* Pointer to a pointer to a memmber */ + + memb_ptr2 = element_ptrptr(st, elm, &save_memb_ptr); + + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + switch(rval.code) { + case RC_OK: + ADVANCE(rval.consumed); + break; + case RC_WMORE: + ASN_DEBUG("More bytes needed at element %s \"%s\"", td->name, + elm->name); + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + case RC_FAIL: + ASN_DEBUG("Decoding failed at element %s \"%s\"", td->name, + elm->name); + RETURN(RC_FAIL); + } + } /* for(all root members) */ + + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 2: + assert(ctx->ptr); + { + /* Cleanup preamble. */ + asn_bit_data_t *preamble = ctx->ptr; + asn_bit_data_t *extadds; + int has_extensions_bit = (specs->first_extension >= 0); + int extensions_present = + has_extensions_bit + && (preamble->buffer == NULL + || (((const uint8_t *)preamble->buffer)[0] & 0x80)); + uint8_t unused_bits; + size_t len = 0; + ssize_t len_len; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 2", td->name); + + preamble->buffer = 0; /* Will do extensions_present==1 next time. */ + + if(!extensions_present) { + ctx->phase = 10; + RETURN(RC_OK); + } + + /* + * X.696 (08/2015) #16.1 (c), #16.4 + * Read in the extension addition presence bitmap. + */ + + len_len = oer_fetch_length(ptr, size, &len); + if(len_len > 0) { + ADVANCE(len_len); + } else if(len_len < 0) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + + if(len == 0) { + /* 16.4.1-2 */ + RETURN(RC_FAIL); + } else if(len > size) { + RETURN(RC_WMORE); + } + + /* Account for unused bits */ + unused_bits = 0x7 & *(const uint8_t *)ptr; + ADVANCE(1); + len--; + if(unused_bits && len == 0) { + RETURN(RC_FAIL); + } + + /* Get the extensions map */ + extadds = asn_bit_data_new_contiguous(ptr, len * 8 - unused_bits); + if(!extadds) { + RETURN(RC_FAIL); + } + FREEMEM(preamble); + ctx->ptr = extadds; + ADVANCE(len); + } + NEXT_PHASE(ctx); + ctx->step = + (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + /* Fall through */ + case 3: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 3 (Extensions)", td->name); + for(; ctx->step < (signed)td->elements_count; ctx->step++) { + asn_bit_data_t *extadds = ctx->ptr; + size_t edx = ctx->step; + asn_TYPE_member_t *elm = &td->elements[edx]; + void *tmp_memb_ptr; + void **memb_ptr2 = element_ptrptr(st, elm, &tmp_memb_ptr); + + switch(asn_get_few_bits(extadds, 1)) { + case -1: + /* + * Not every one of our extensions is known to the remote side. + * Continue filling in their defaults though. + */ + /* Fall through */ + case 0: + /* Fill-in DEFAULT */ + if(elm->default_value_set + && elm->default_value_set(memb_ptr2)) { + RETURN(RC_FAIL); + } + continue; + case 1: { + /* Read OER open type */ + ssize_t ot_size = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + assert(ot_size <= (ssize_t)size); + if(ot_size > 0) { + ADVANCE(ot_size); + } else if(ot_size < 0) { + RETURN(RC_FAIL); + } else { + /* Roll back open type parsing */ + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + break; + } + default: + RETURN(RC_FAIL); + } + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 4: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 4", td->name); + /* Read in the rest of Open Types while ignoring them */ + for(;;) { + asn_bit_data_t *extadds = ctx->ptr; + switch(asn_get_few_bits(extadds, 1)) { + case 0: + continue; + case 1: { + ssize_t skipped = oer_open_type_skip(ptr, size); + if(skipped > 0) { + ADVANCE(skipped); + } else if(skipped < 0) { + RETURN(RC_FAIL); + } else { + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + continue; + } + case -1: + /* No more Open Type encoded components */ + break; + default: + RETURN(RC_FAIL); + } + break; + } + } + + RETURN(RC_OK); +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + size_t computed_size = 0; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + uint32_t has_extensions = 0; + size_t edx; + int ret; + + (void)constraints; + + if(preamble_bits) { + asn_bit_outp_t preamble; + + memset(&preamble, 0, sizeof(preamble)); + preamble.output = cb; + preamble.op_key = app_key; + + if(has_extensions_bit) { + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default values in extensions */ + } else { + has_extensions = 1; + break; + } + } + } + ret = asn_put_few_bits(&preamble, has_extensions, 1); + assert(ret == 0); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + + /* + * Encode optional components bitmap. + */ + if(specs->roms_count) { + FOR_IN_ROOT_GROUP(edx) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + if(elm->optional) { + const void *memb_ptr = element_ptr(sptr, elm); + uint32_t has_component = memb_ptr != NULL; + if(has_component && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + has_component = 0; + } + ret = asn_put_few_bits(&preamble, has_component, 1); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + } + } + + asn_put_aligned_flush(&preamble); + computed_size += preamble.flushed_bytes; + } /* if(preamble_bits) */ + + /* + * Put root components and extensions root. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t er = {0,0,0}; + const void *memb_ptr; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Skip default values in encoding */ + continue; + } + } else { + if(elm->optional) continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + if(!elm->type->op->oer_encoder) { + ASN_DEBUG("OER encoder is not defined for type %s", elm->type->name); + ASN__ENCODE_FAILED; + } + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded == -1) { + ASN_DEBUG("... while encoding %s member \"%s\"\n", td->name, + elm->name); + return er; + } + computed_size += er.encoded; + } + + /* + * Before encode extensions, encode extensions additions presense bitmap + # X.696 (08/2015) #16.4. + */ + if(has_extensions) { + asn_bit_outp_t extadds; + + /* Special case allowing us to use exactly one byte for #8.6 */ + size_t aoms_length_bits = specs->aoms_count; + size_t aoms_length_bytes = (7 + aoms_length_bits) >> 3; + uint8_t unused_bits = 0x07 & (8 - (aoms_length_bits & 0x07)); + + assert(1 + aoms_length_bytes <= 127); + + memset(&extadds, 0, sizeof(extadds)); + extadds.output = cb; + extadds.op_key = app_key; + + /* #8.6 length determinant */ + ret = asn_put_few_bits(&extadds, (1 + aoms_length_bytes), 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Number of unused bytes, #16.4.2 */ + ret = asn_put_few_bits(&extadds, unused_bits, 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Encode presence bitmap #16.4.3 */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + memb_ptr = 0; /* Do not encode default value. */ + } + ret |= asn_put_few_bits(&extadds, memb_ptr ? 1 : 0, 1); + } + if(ret < 0) ASN__ENCODE_FAILED; + + asn_put_aligned_flush(&extadds); + computed_size += extadds.flushed_bytes; + + /* Now, encode extensions */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default value. */ + } else { + ssize_t wrote = oer_open_type_put( + elm->type, elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(wrote == -1) { + ASN__ENCODE_FAILED; + } + computed_size += wrote; + } + } else if(!elm->optional) { + ASN__ENCODE_FAILED; + } + } + } /* if(has_extensions) */ + + + { + asn_enc_rval_t er = {0, 0, 0}; + er.encoded = computed_size; + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_MASTER/constr_SET_OF.c b/src/codec_utils/E2AP_MASTER/constr_SET_OF.c new file mode 100644 index 000000000..bf1dc2776 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SET_OF.c @@ -0,0 +1,1441 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", td->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(elm->tag != (ber_tlv_tag_t)-1) { + if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), td->name); + ASN_DEBUG("%s SET OF has tag %s", + td->name, ber_tlv_tag_string(elm->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, + elm->type, &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + td->name, elm->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((const char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((const char *)ptr)[0] == 0 + && ((const char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t allocated_size; + unsigned bits_unused; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; + + if(el_buf->length + size > el_buf->allocated_size) { + size_t new_size = el_buf->allocated_size ? el_buf->allocated_size : 8; + void *p; + + do { + new_size <<= 2; + } while(el_buf->length + size > new_size); + + p = REALLOC(el_buf->buf, new_size); + if(p) { + el_buf->buf = p; + el_buf->allocated_size = new_size; + } else { + return -1; + } + } + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} + +static void assert_unused_bits(const struct _el_buffer* p) { + if(p->length) { + assert((p->buf[p->length-1] & ~(0xff << p->bits_unused)) == 0); + } else { + assert(p->bits_unused == 0); + } +} + +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; + size_t common_len; + int ret = 0; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + if (a->buf && b->buf) { + ret = memcmp(a->buf, b->buf, common_len); + } + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + /* Ignore unused bits. */ + assert_unused_bits(a); + assert_unused_bits(b); + } + + return ret; +} + +static void +SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { + size_t i; + + for(i = 0; i < count; i++) { + FREEMEM(el_buf[i].buf); + } + + FREEMEM(el_buf); +} + +enum SET_OF__encode_method { + SOES_DER, /* Distinguished Encoding Rules */ + SOES_CUPER /* Canonical Unaligned Packed Encoding Rules */ +}; + +static struct _el_buffer * +SET_OF__encode_sorted(const asn_TYPE_member_t *elm, + const asn_anonymous_set_ *list, + enum SET_OF__encode_method method) { + struct _el_buffer *encoded_els; + int edx; + + encoded_els = + (struct _el_buffer *)CALLOC(list->count, sizeof(encoded_els[0])); + if(encoded_els == NULL) { + return NULL; + } + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + const void *memb_ptr = list->array[edx]; + struct _el_buffer *encoding_el = &encoded_els[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) break; + + /* + * Encode the member into the prepared space. + */ + switch(method) { + case SOES_DER: + erval = elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, + _el_addbytes, encoding_el); + break; + case SOES_CUPER: + erval = uper_encode(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, _el_addbytes, encoding_el); + if(erval.encoded != -1) { + size_t extra_bits = erval.encoded % 8; + assert(encoding_el->length == (size_t)(erval.encoded + 7) / 8); + encoding_el->bits_unused = (8 - extra_bits) & 0x7; + } + break; + default: + assert(!"Unreachable"); + break; + } + if(erval.encoded < 0) break; + } + + if(edx == list->count) { + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, list->count, sizeof(encoded_els[0]), _el_buf_cmp); + + return encoded_els; + } else { + SET_OF__encode_sorted_free(encoded_els, edx); + return NULL; + } +} + + +/* + * The DER encoder of the SET OF type. + */ +asn_enc_rval_t +SET_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) ASN__ENCODE_FAILED; + + erval = + elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) return erval; + computed_size += erval.encoded; + } + + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = + der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + if(encoding_size < 0) { + ASN__ENCODE_FAILED; + } + computed_size += encoding_size; + + if(!cb || list->count == 0) { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of %s SET OF", td->name); + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_DER); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + for(edx = 0; edx < list->count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(cb(encoded_el->buf, encoded_el->length, app_key) < 0) { + break; + } else { + encoding_size += encoded_el->length; + } + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if(edx == list->count) { + asn_enc_rval_t erval = {0,0,0}; + assert(computed_size == (size_t)encoding_size); + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } else { + ASN__ENCODE_FAILED; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SET_OF_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *element = td->elements; + const char *elm_tag; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval = {RC_OK, 0};/* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + for(; ctx->phase <= 2;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Go inside the inner member of a set. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval = {RC_OK, 0}; + + /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); + tmprval = element->type->op->xer_decoder(opt_codec_ctx, + element->type, &ctx->ptr, elm_tag, + buf_ptr, size); + if(tmprval.code == RC_OK) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + ctx->ptr = 0; + XER_ADVANCE(tmprval.consumed); + } else { + XER_ADVANCE(tmprval.consumed); + RETURN(tmprval.code); + } + ctx->phase = 1; /* Back to body processing */ + ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + /* No more things to decode */ + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + RETURN(RC_OK); + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); + if(ctx->phase == 1) { + /* + * Process a single possible member. + */ + ctx->phase = 2; + continue; + } + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SET OF"); + break; + } + + ctx->phase = 3; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + + + +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + +asn_enc_rval_t +SET_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + er.encoded = 0; + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + ASN__CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + ASN__ENCODE_FAILED; +cleanup: + if(encs) { + size_t n; + for(n = 0; n < encs_count; n++) { + FREEMEM(encs[n].buffer); + } + FREEMEM(encs); + } + ASN__ENCODED_OK(er); +} + +int +SET_OF_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int ret; + int i; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + _i_INDENT(1); + + ret = elm->type->op->print_struct(elm->type, memb_ptr, + ilevel + 1, cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SET_OF_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(td && ptr) { + const asn_SET_OF_specifics_t *specs; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ + + specs = (const asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } + } +} + +int +SET_OF_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + asn_constr_check_f *constr; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int i; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + constr = elm->encoding_constraints.general_constraints; + if(!constr) constr = elm->type->encoding_constraints.general_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + int ret; + + if(!memb_ptr) continue; + + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SET_OF_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, -1, 0, &repeat); + ASN_DEBUG("Got to decode %" ASN_PRI_SSIZE " elements (eff %d)", + nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) { + if(rv.consumed == 0 && nelems > 200) { + /* Protect from SET OF NULL compression bombs. */ + ASN__DECODE_FAILED; + } + continue; + } + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +asn_enc_rval_t +SET_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + const asn_TYPE_member_t *elm = td->elements; + struct _el_buffer *encoded_els; + asn_enc_rval_t er = {0,0,0}; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + + list = _A_CSET_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + + /* + * Canonical UPER #22.1 mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_CUPER); + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + const struct _el_buffer *el = &encoded_els[edx]; + if(asn_put_many_bits(po, el->buf, + (8 * el->length) - el->bits_unused) < 0) { + break; + } + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if((ssize_t)encoded_edx == list->count) { + ASN__ENCODED_OK(er); + } else { + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +SET_OF_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = aper_get_nsnnwn(pd, ct->upper_bound - ct->lower_bound + 1); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = aper_get_length(pd, ct ? ct->upper_bound - ct->lower_bound + 1 : -1, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + (int)nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +struct comparable_ptr { + const asn_TYPE_descriptor_t *td; + const void *sptr; +}; + +static int +SET_OF__compare_cb(const void *aptr, const void *bptr) { + const struct comparable_ptr *a = aptr; + const struct comparable_ptr *b = bptr; + assert(a->td == b->td); + return a->td->op->compare_struct(a->td, a->sptr, b->sptr); +} + +int +SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_set_ *a = _A_CSET_FROM_VOID(aptr); + const asn_anonymous_set_ *b = _A_CSET_FROM_VOID(bptr); + + if(a && b) { + struct comparable_ptr *asorted; + struct comparable_ptr *bsorted; + ssize_t common_length; + ssize_t idx; + + if(a->count == 0) { + if(b->count) return -1; + return 0; + } else if(b->count == 0) { + return 1; + } + + asorted = MALLOC(a->count * sizeof(asorted[0])); + bsorted = MALLOC(b->count * sizeof(bsorted[0])); + if(!asorted || !bsorted) { + FREEMEM(asorted); + FREEMEM(bsorted); + return -1; + } + + for(idx = 0; idx < a->count; idx++) { + asorted[idx].td = td->elements->type; + asorted[idx].sptr = a->array[idx]; + } + + for(idx = 0; idx < b->count; idx++) { + bsorted[idx].td = td->elements->type; + bsorted[idx].sptr = b->array[idx]; + } + + qsort(asorted, a->count, sizeof(asorted[0]), SET_OF__compare_cb); + qsort(bsorted, b->count, sizeof(bsorted[0]), SET_OF__compare_cb); + + common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, asorted[idx].sptr, bsorted[idx].sptr); + if(ret) { + FREEMEM(asorted); + FREEMEM(bsorted); + return ret; + } + } + + FREEMEM(asorted); + FREEMEM(bsorted); + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SET_OF = { + SET_OF_free, + SET_OF_print, + SET_OF_compare, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SET_OF_decode_oer, + SET_OF_encode_oer, +#endif +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SET_OF_decode_uper, + SET_OF_encode_uper, + SET_OF_decode_aper, + 0, /* SET_OF_encode_aper */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + SET_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SET_OF_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_SET_OF_specifics_t *specs = + (const asn_SET_OF_specifics_t *)td->specifics; + asn_random_fill_result_t res_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm = td->elements; + void *st = *sptr; + long max_elements = 5; + long slb = 0; /* Lower size bound */ + long sub = 0; /* Upper size bound */ + size_t rnd_len; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) { + return result_failed; + } + } + + switch(asn_random_between(0, 6)) { + case 0: max_elements = 0; break; + case 1: max_elements = 1; break; + case 2: max_elements = 5; break; + case 3: max_elements = max_length; break; + case 4: max_elements = max_length / 2; break; + case 5: max_elements = max_length / 4; break; + default: break; + } + sub = slb + max_elements; + + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->size; + if(pc->flags & APC_SEMI_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->lower_bound + max_elements; + } else if(pc->flags & APC_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->upper_bound; + if(sub - slb > max_elements) sub = slb + max_elements; + } + } + + /* Bias towards edges of allowed space */ + switch(asn_random_between(-1, 4)) { + default: + case -1: + /* Prepare lengths somewhat outside of constrained range. */ + if(constraints->per_constraints + && (constraints->per_constraints->size.flags & APC_EXTENSIBLE)) { + switch(asn_random_between(0, 5)) { + default: + case 0: + rnd_len = 0; + break; + case 1: + if(slb > 0) { + rnd_len = slb - 1; + } else { + rnd_len = 0; + } + break; + case 2: + rnd_len = asn_random_between(0, slb); + break; + case 3: + if(sub < (ssize_t)max_length) { + rnd_len = sub + 1; + } else { + rnd_len = max_length; + } + break; + case 4: + if(sub < (ssize_t)max_length) { + rnd_len = asn_random_between(sub + 1, max_length); + } else { + rnd_len = max_length; + } + break; + case 5: + rnd_len = max_length; + break; + } + break; + } + /* Fall through */ + case 0: + rnd_len = asn_random_between(slb, sub); + break; + case 1: + if(slb < sub) { + rnd_len = asn_random_between(slb + 1, sub); + break; + } + /* Fall through */ + case 2: + rnd_len = asn_random_between(slb, slb); + break; + case 3: + if(slb < sub) { + rnd_len = asn_random_between(slb, sub - 1); + break; + } + /* Fall through */ + case 4: + rnd_len = asn_random_between(sub, sub); + break; + } + + for(; rnd_len > 0; rnd_len--) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + void *ptr = 0; + asn_random_fill_result_t tmpres = elm->type->op->random_fill( + elm->type, &ptr, &elm->encoding_constraints, + (max_length > res_ok.length ? max_length - res_ok.length : 0) + / rnd_len); + switch(tmpres.code) { + case ARFILL_OK: + ASN_SET_ADD(list, ptr); + res_ok.length += tmpres.length; + break; + case ARFILL_SKIPPED: + break; + case ARFILL_FAILED: + assert(ptr == 0); + return tmpres; + } + } + + return res_ok; +} + diff --git a/src/codec_utils/E2AP_MASTER/constr_SET_OF.h b/src/codec_utils/E2AP_MASTER/constr_SET_OF.h new file mode 100644 index 000000000..768106271 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SET_OF.h @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef CONSTR_SET_OF_H +#define CONSTR_SET_OF_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SET_OF_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ +} asn_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; +asn_struct_compare_f SET_OF_compare; +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +xer_type_decoder_f SET_OF_decode_xer; +xer_type_encoder_f SET_OF_encode_xer; +oer_type_decoder_f SET_OF_decode_oer; +oer_type_encoder_f SET_OF_encode_oer; +per_type_decoder_f SET_OF_decode_uper; +per_type_encoder_f SET_OF_encode_uper; +per_type_decoder_f SET_OF_decode_aper; +per_type_encoder_f SET_OF_encode_aper; +asn_random_fill_f SET_OF_random_fill; +extern asn_TYPE_operation_t asn_OP_SET_OF; + +#ifdef __cplusplus +} +#endif + +#endif /* CONSTR_SET_OF_H */ diff --git a/src/codec_utils/E2AP_MASTER/constr_SET_OF_oer.c b/src/codec_utils/E2AP_MASTER/constr_SET_OF_oer.c new file mode 100644 index 000000000..520051811 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_SET_OF_oer.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +/* + * The SEQUENCE OF and SET OF values utilize a "quantity field". + * It is is a pointless combination of #8.6 (length determinant, capable + * of encoding tiny and huge numbers in the shortest possible number of octets) + * and the variable sized integer. What could have been encoded by #8.6 alone + * is required to be encoded by #8.6 followed by that number of unsigned octets. + * This doesn't make too much sense. It seems that the original version of OER + * standard have been using the unconstrained unsigned integer as a quantity + * field, and this legacy have gone through ISO/ITU-T standardization process. + */ +static ssize_t +oer_fetch_quantity(const void *ptr, size_t size, size_t *qty_r) { + const uint8_t *b; + const uint8_t *bend; + size_t len = 0; + size_t qty; + + ssize_t len_len = oer_fetch_length(ptr, size, &len); + if(len_len <= 0) { + *qty_r = 0; + return len_len; + } + + if((len_len + len) > size) { + *qty_r = 0; + return 0; + } + + b = (const uint8_t *)ptr + len_len; + bend = b + len; + + /* Skip the leading 0-bytes */ + for(; b < bend && *b == 0; b++) { + } + + if((bend - b) > (ssize_t)sizeof(size_t)) { + /* Length is not representable by the native size_t type */ + *qty_r = 0; + return -1; + } + + for(qty = 0; b < bend; b++) { + qty = (qty << 8) + *b; + } + + if(qty > RSIZE_MAX) { /* A bit of C11 validation */ + *qty_r = 0; + return -1; + } + + *qty_r = qty; + assert((size_t)len_len + len == (size_t)(bend - (const uint8_t *)ptr)); + return len_len + len; +} + +asn_dec_rval_t +SET_OF_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch number of elements to decode. + */ + size_t length = 0; + size_t len_size = oer_fetch_quantity(ptr, size, &length); + switch(len_size) { + case 0: + RETURN(RC_WMORE); + case -1: + RETURN(RC_FAIL); + default: + ADVANCE(len_size); + ctx->left = length; + } + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + const void *base_ptr = ptr; + ber_tlv_len_t base_ctx_left = ctx->left; + + assert(td->elements_count == 1); + + ASN_DEBUG("OER SET OF %s Decoding PHASE 1", td->name); + + for(; ctx->left > 0; ctx->left--) { + asn_dec_rval_t rv = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, &ctx->ptr, ptr, + size); + ADVANCE(rv.consumed); + switch(rv.code) { + case RC_OK: + if(ASN_SET_ADD(list, ctx->ptr) != 0) { + RETURN(RC_FAIL); + } else { + ctx->ptr = 0; + /* + * This check is to avoid compression bomb with + * specs like SEQUENCE/SET OF NULL which don't + * consume data at all. + */ + if(rv.consumed == 0 && base_ptr == ptr + && (base_ctx_left - ctx->left) > 200) { + ASN__DECODE_FAILED; + } + break; + } + case RC_WMORE: + RETURN(RC_WMORE); + case RC_FAIL: + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + SET_PHASE(ctx, 3); + RETURN(RC_FAIL); + } + } + /* Decoded decently. */ + NEXT_PHASE(ctx); + } + /* Fall through */ + case 2: + /* Ignore fully decoded */ + assert(ctx->left == 0); + RETURN(RC_OK); + case 3: + /* Failed to decode. */ + RETURN(RC_FAIL); + } + + return rval; +} + +static ssize_t +oer_put_quantity(size_t qty, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t buf[1 + sizeof(size_t)]; + uint8_t *b = &buf[sizeof(size_t)]; /* Last addressable */ + size_t encoded; + + do { + *b-- = qty; + qty >>= 8; + } while(qty); + + *b = sizeof(buf) - (b-buf) - 1; + encoded = sizeof(buf) - (b-buf); + if(cb(b, encoded, app_key) < 0) + return -1; + return encoded; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SET_OF_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_TYPE_member_t *elm; + const asn_anonymous_set_ *list; + size_t computed_size = 0; + ssize_t qty_len; + int n; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + elm = td->elements; + list = _A_CSET_FROM_VOID(sptr); + + qty_len = oer_put_quantity(list->count, cb, app_key); + if(qty_len < 0) { + ASN__ENCODE_FAILED; + } + computed_size += qty_len; + + for(n = 0; n < list->count; n++) { + void *memb_ptr = list->array[n]; + asn_enc_rval_t er = {0,0,0}; + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded < 0) { + return er; + } else { + computed_size += er.encoded; + } + } + + { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_MASTER/constr_TYPE.c b/src/codec_utils/E2AP_MASTER/constr_TYPE.c new file mode 100644 index 000000000..aefaefdb7 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_TYPE.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn_TYPE_outmost_tag(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->op->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, + const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->op->print_struct(td, struct_ptr, 1, _print2fp, stream)) { + return -1; + } + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) { + return -1; + } + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} diff --git a/src/codec_utils/E2AP_MASTER/constr_TYPE.h b/src/codec_utils/E2AP_MASTER/constr_TYPE.h new file mode 100644 index 000000000..d80dea5a3 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constr_TYPE.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ + void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ +} asn_struct_ctx_t; + +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#include /* Subtype constraints support */ +#include /* Random structures support */ + +#ifdef ASN_DISABLE_OER_SUPPORT +typedef void (oer_type_decoder_f)(void); +typedef void (oer_type_encoder_f)(void); +typedef void asn_oer_constraints_t; +#else +#include /* Octet Encoding Rules encoder */ +#include /* Octet Encoding Rules encoder */ +#endif + +/* + * Free the structure according to its specification. + * Use one of ASN_STRUCT_{FREE,RESET,CONTENTS_ONLY} macros instead. + * Do not use directly. + */ +enum asn_struct_free_method { + ASFM_FREE_EVERYTHING, /* free(struct_ptr) and underlying members */ + ASFM_FREE_UNDERLYING, /* free underlying members */ + ASFM_FREE_UNDERLYING_AND_RESET /* FREE_UNDERLYING + memset(0) */ +}; +typedef void (asn_struct_free_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, enum asn_struct_free_method); + +/* + * Free the structure including freeing the memory pointed to by ptr itself. + */ +#define ASN_STRUCT_FREE(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_EVERYTHING) + +/* + * Free the memory used by the members of the structure without freeing the + * the structure pointer itself. + * ZERO-OUT the structure to the safe clean state. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + */ +#define ASN_STRUCT_RESET(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING_AND_RESET) + +/* + * Free memory used by the members of the structure without freeing + * the structure pointer itself. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + * AVOID using it in the application code; + * Use a safer ASN_STRUCT_RESET() instead. + */ +#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING) + +/* + * Print the structure according to its specification. + */ +typedef int(asn_struct_print_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Compare two structs between each other. + * Returns <0 if struct_A is "smaller" than struct_B, >0 if "greater", + * and =0 if "equal to", for some type-specific, stable definition of + * "smaller", "greater" and "equal to". + */ +typedef int (asn_struct_compare_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_A, + const void *struct_B); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type; used internally. */ +asn_outmost_tag_f asn_TYPE_outmost_tag; + +/* + * Fetch the desired type of the Open Type based on the + * Information Object Set driven constraints. + */ +typedef struct asn_type_selector_result_s { + const struct asn_TYPE_descriptor_s *type_descriptor; /* Type encoded. */ + unsigned presence_index; /* Associated choice variant. */ +} asn_type_selector_result_t; +typedef asn_type_selector_result_t(asn_type_selector_f)( + const struct asn_TYPE_descriptor_s *parent_type_descriptor, + const void *parent_structure_ptr); + +/* + * Generalized functions for dealing with the speciic type. + * May be directly invoked by applications. + */ +typedef struct asn_TYPE_operation_s { + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_struct_compare_f *compare_struct; /* Compare two structures */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + oer_type_decoder_f *oer_decoder; /* Generic OER decoder */ + oer_type_encoder_f *oer_encoder; /* Canonical OER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + per_type_decoder_f *aper_decoder; /* Aligned PER decoder */ + per_type_encoder_f *aper_encoder; /* Aligned PER encoder */ + asn_random_fill_f *random_fill; /* Initialize with a random value */ + asn_outmost_tag_f *outmost_tag; /* */ +} asn_TYPE_operation_t; + +/* + * A constraints tuple specifying both the OER and PER constraints. + */ +typedef struct asn_encoding_constraints_s { + const struct asn_oer_constraints_s *oer_constraints; + const struct asn_per_constraints_s *per_constraints; + asn_constr_check_f *general_constraints; +} asn_encoding_constraints_t; + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn_TYPE_descriptor_s { + const char *name; /* A name of the ASN.1 type. "" in some cases. */ + const char *xml_tag; /* Name used in XML tag */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_TYPE_operation_t *op; + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ + + /* + * Tags that are expected to occur. + */ + const ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ + unsigned tags_count; /* Number of tags which are expected */ + const ber_tlv_tag_t *all_tags; /* Every tag for BER/containment */ + unsigned all_tags_count; /* Number of tags */ + + /* OER, PER, and general constraints */ + asn_encoding_constraints_t encoding_constraints; + + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn_TYPE_member_s *elements; + unsigned elements_count; + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + const void *specifics; +} asn_TYPE_descriptor_t; + +/* + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. + */ + enum asn_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* Open Type */ + ATF_ANY_TYPE = 0x04 /* ANY type (deprecated!) */ + }; +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ + unsigned optional; /* Following optional members, including current */ + unsigned memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_type_selector_f *type_selector; /* IoS runtime type selector */ + asn_encoding_constraints_t encoding_constraints; + int (*default_value_cmp)(const void *sptr); /* Compare DEFAULT */ + int (*default_value_set)(void **sptr); /* Set DEFAULT */ + const char *name; /* ASN.1 identifier of the element */ +} asn_TYPE_member_t; + +/* + * BER tag to element number mapping. + */ +typedef struct asn_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + unsigned el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relative */ +} asn_TYPE_tag2member_t; + +/* + * This function prints out the contents of the target language's structure + * (struct_ptr) into the file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/src/codec_utils/E2AP_MASTER/constraints.c b/src/codec_utils/E2AP_MASTER/constraints.c new file mode 100644 index 000000000..df3c6c194 --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constraints.c @@ -0,0 +1,93 @@ +#include +#include + +int +asn_generic_no_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Unknown how to check */ + return 0; +} + +struct errbufDesc { + const asn_TYPE_descriptor_t *failed_type; + const void *failed_struct_ptr; + char *errbuf; + size_t errlen; +}; + +static void +_asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr, + const char *fmt, ...) { + struct errbufDesc *arg = key; + va_list ap; + ssize_t vlen; + ssize_t maxlen; + + arg->failed_type = td; + arg->failed_struct_ptr = sptr; + + maxlen = arg->errlen; + if(maxlen <= 0) + return; + + va_start(ap, fmt); + vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); + va_end(ap); + if(vlen >= maxlen) { + arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ + arg->errlen = maxlen - 1; /* Not counting termination */ + return; + } else if(vlen >= 0) { + arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ + arg->errlen = vlen; /* Not counting termination */ + } else { + /* + * The libc on this system is broken. + */ + vlen = sizeof("") - 1; + maxlen--; + arg->errlen = vlen < maxlen ? vlen : maxlen; + memcpy(arg->errbuf, "", arg->errlen); + arg->errbuf[arg->errlen] = 0; + } + + return; +} + +int +asn_check_constraints(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + struct errbufDesc arg; + int ret; + + arg.failed_type = 0; + arg.failed_struct_ptr = 0; + arg.errbuf = errbuf; + arg.errlen = errlen ? *errlen : 0; + + ret = type_descriptor->encoding_constraints.general_constraints( + type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg); + if(ret == -1 && errlen) *errlen = arg.errlen; + + return ret; +} + diff --git a/src/codec_utils/E2AP_MASTER/constraints.h b/src/codec_utils/E2AP_MASTER/constraints.h new file mode 100644 index 000000000..0bd86a96b --- /dev/null +++ b/src/codec_utils/E2AP_MASTER/constraints.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN1_CONSTRAINTS_VALIDATOR_H +#define ASN1_CONSTRAINTS_VALIDATOR_H + +#include /* Platform-dependent types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + * + * RETURN VALUES: + * This function returns 0 in case all ASN.1 constraints are met + * and -1 if one or more constraints were failed. + */ +int asn_check_constraints( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ +); + + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int(asn_constr_check_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, + asn_app_constraint_failed_f *optional_callback, /* Log the error */ + void *optional_app_key /* Opaque key passed to a callback */ +); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define ASN__CTFAIL if(ctfailcb) ctfailcb + +#ifdef __cplusplus +} +#endif + +#endif /* ASN1_CONSTRAINTS_VALIDATOR_H */ diff --git a/src/codec_utils/E2AP_MASTER/e2ap b/src/codec_utils/E2AP_MASTER/e2ap new file mode 100644 index 0000000000000000000000000000000000000000..97c6a6f2d5d87de425b8ba18109f6830bd41fe00 GIT binary patch literal 523240 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

tj;eYOC729vC>Plmps3F70 zT=70ij3$3o8Ny94qev6Qv`!?m!rmI z&25(y_3jaVwx11w=&Z?;)DRb$O?y*Rs=gn&f?*bH6*r>8m|i7JLD*ydV<-B51bq5Yfflc#%+_73)byvr-H zHXBFD7#h#bcUs^~h+A^YT%v9NY1rkXWJq!RbetbxG+(d}+> z6DTVr7)MwL2NbmrVi+2goMAC!RMfmd4HHLg55sK<44OY^6E`SVuObf} zu|2!Cs(z;jmS-5W>j2(jxR}DbT)N9`rKrmh4eKEVfj{!Wjoey#Y3olZ>seX6Pa2Zs zTesc#Gf=a|ezMXr8>w+55|zz`b)yLTO%13;S=pB%g~v$Wq)%*D@XDsZG=PYQ%oUmu*C&sWzSk;cUx^L?g7BY&1tWt zxhngxi!sXz=dIG>vaEw=hz%iyowm=##>|8gdXi=ms%sf9eLF|4 zox%)acX7FRWuu>HDBhwl-UU}G%7!k0wxS~%qN(+xlbZHNFCnwXuXpX>`?Fn&gmLhD zheKKACKA~mtW0<7D}dQNc~=J#I9gA&zvdT2=`*GI%ZUI_D?_G|}19I~lUwVSNP6+{nu-Y8|rW z#jti6q$|b3Sha|BOeB>M9uC_9$Uss;X)#hH3$I%Aq(^ zWjLf1B$+@Yse56=rEOzdXqs)ijcYv9e4>L1MS-*#s~=nmQA?HHRQg%?gL{%7D$PmV z%E2&=n=-j{`3iAjXhFq&$rE%O7@5gWn}7!2OUxlc!^VQ3oh}M>35y_2Vyn=8B<~ki zuaX8;w?ju`AG#OmAg+_}q~Jos9+lSXZg!B9jYF9EEDdZ8w{mU^ctx%fiTUisc?1b}kBCC$c zD4cQ|8e$N1pE~!uw-Y~Mughq5l&vqIO~M?W?$Jv7L9uC)TQ^r#-UNB(ciDU2WXE=f zc`2d?D5ZXASG4pWtyprIh zGNj+)bTuQ$Fe=~>DtR(d8@*TyY%ybcs+iIQ0%xDKfRXsm-$sITLY9jE<6bkde_#3eJ`#v52M!6}Tr zQ)jQViX%0pMY?1d^Os01P!`M`F44}Xf|kH#s+-dIGw`J1qep7L5Ff}%%=1j|3-HPVaMpAYtN3M5&gwg z`7AN6q2K@X2*9A5(Z%=(5SlKqd3b_n0&Ku)PO|}XRNM#A{Qv)c7n=AL_;*E`x_xDv zzTK7wzbDW217ZE&AHa|A!9T5kaAg~QHO+xMxJtj$f4`c((zi|c-`8JU*{0_UssD%c zEB%+(zYj&f{Px?a_W#+HZ36yG9=t`rn&vh6{JwnZ$3A@db@-?CzqqmuznbO?dGLvR zeixo0?OOj01cJXG!@uvqKdt}pwQcy-G!Lc2*D{7>Kbt=R*l!*F``_Kh>diiO2!FTu z!|>OB^z#Ljf8*+ZBK1F!`rA@J$6p>dKY=gEQ*H0(Qvc^t|Dgcp{8Re>Lh9cWxYxh8 zP2XO}L507!q+zU&b#ngwH9SL}NO#TcU)zRX4Sdo^^Co}T|A?#q`z!e2>whTqKa~1^ zo-zD&sjQ!$X7#`P!8SpB`2z-2eEC`lf`_(6Z2VZ>s zPrulqqEElzdP0VR(^%OL`11Gg59{mreJ=Gsm-?Umn}=?itMO;^5AfU9zx~tu1abSP z%;|snome5~|37E-zy2B5|N3VP`N!|a`Z+)U1&V(Y{wbGU|K^w~y#5W>&*Agm{|eB* zt{(nGSq+k2LD)q0fS^qzwF3PUfe@p7WCG~%Sjl-YHx8kpI@EMf({=fc~ z>HqrMVfwY5|IX?+O^4mVA8YI{_=o+k_4M;=DDnM&DfPdU`Vap|2#^-8T1))p8~DJs zl>Y4>o>0MCKV*u(Vleyvs(s@x-+|__hiln$t$#CnuGr}3Z$r8E?LpuCA2vY0p@34D u{iMECcYOU11^>_gouB?beEcPlq. All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_ENCODER_H_ +#define _PER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) + */ +asn_enc_rval_t uper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +asn_enc_rval_t aper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ +asn_enc_rval_t uper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); + +asn_enc_rval_t aper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-packing + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); + +ssize_t +aper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *td, + const asn_per_constraints_t *constraints, + const void *sptr, + void **buffer_r +); + +/* + * Type of the generic PER encoder function. + */ +typedef asn_enc_rval_t(per_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, const void *struct_ptr, + asn_per_outp_t *per_output); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_ENCODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/BIT_STRING.c b/src/codec_utils/E2SMKPM/BIT_STRING.c new file mode 100644 index 000000000..e8d7354c8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/BIT_STRING.c @@ -0,0 +1,656 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * BIT STRING basic type description. + */ +static const ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) +}; +asn_OCTET_STRING_specifics_t asn_SPC_BIT_STRING_specs = { + sizeof(BIT_STRING_t), + offsetof(BIT_STRING_t, _asn_ctx), + ASN_OSUBV_BIT +}; +asn_TYPE_operation_t asn_OP_BIT_STRING = { + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + BIT_STRING_print, + BIT_STRING_compare, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_decode_xer_binary, + BIT_STRING_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + BIT_STRING_decode_oer, + BIT_STRING_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + BIT_STRING_decode_uper, /* Unaligned PER decoder */ + BIT_STRING_encode_uper, /* Unaligned PER encoder */ + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + BIT_STRING_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { + "BIT STRING", + "BIT_STRING", + &asn_OP_BIT_STRING, + asn_DEF_BIT_STRING_tags, + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), + asn_DEF_BIT_STRING_tags, /* Same as above */ + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), + { 0, 0, BIT_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_BIT_STRING_specs +}; + +/* + * BIT STRING generic constraint. + */ +int +BIT_STRING_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + + if(st && st->buf) { + if((st->size == 0 && st->bits_unused) + || st->bits_unused < 0 || st->bits_unused > 7) { + ASN__CTFAIL(app_key, td, sptr, + "%s: invalid padding byte (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + return 0; +} + +static const char *_bit_pattern[16] = { + "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", + "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" +}; + +asn_enc_rval_t +BIT_STRING_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0, 0, 0}; + char scratch[128]; + char *p = scratch; + char *scend = scratch + (sizeof(scratch) - 10); + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + int xcan = (flags & XER_F_CANONICAL); + uint8_t *buf; + uint8_t *end; + + if(!st || !st->buf) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + buf = st->buf; + end = buf + st->size - 1; /* Last byte is special */ + + /* + * Binary dump + */ + for(; buf < end; buf++) { + int v = *buf; + int nline = xcan?0:(((buf - st->buf) % 8) == 0); + if(p >= scend || nline) { + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + if(nline) ASN__TEXT_INDENT(1, ilevel); + } + memcpy(p + 0, _bit_pattern[v >> 4], 4); + memcpy(p + 4, _bit_pattern[v & 0x0f], 4); + p += 8; + } + + if(!xcan && ((buf - st->buf) % 8) == 0) + ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + + if(buf == end) { + int v = *buf; + int ubits = st->bits_unused; + int i; + for(i = 7; i >= ubits; i--) + *p++ = (v & (1 << i)) ? 0x31 : 0x30; + ASN__CALLBACK(scratch, p - scratch); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + + +/* + * BIT STRING specific contents printer. + */ +int +BIT_STRING_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + char scratch[64]; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + uint8_t *buf; + uint8_t *end; + char *p = scratch; + + (void)td; /* Unused argument */ + + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + ilevel++; + buf = st->buf; + end = buf + st->size; + + /* + * Hexadecimal dump. + */ + for(; buf < end; buf++) { + if((buf - st->buf) % 16 == 0 && (st->size > 16) + && buf != st->buf) { + _i_INDENT(1); + /* Dump the string */ + if(cb(scratch, p - scratch, app_key) < 0) return -1; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + + if(p > scratch) { + p--; /* Eat the tailing space */ + + if((st->size > 16)) { + _i_INDENT(1); + } + + /* Dump the incomplete 16-bytes row */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + } + + if(st->bits_unused) { + int ret = snprintf(scratch, sizeof(scratch), " (%d bit%s unused)", + st->bits_unused, st->bits_unused == 1 ? "" : "s"); + assert(ret > 0 && ret < (ssize_t)sizeof(scratch)); + if(ret > 0 && ret < (ssize_t)sizeof(scratch) + && cb(scratch, ret, app_key) < 0) + return -1; + } + + return 0; +} + +/* + * Non-destructively remove the trailing 0-bits from the given bit string. + */ +static const BIT_STRING_t * +BIT_STRING__compactify(const BIT_STRING_t *st, BIT_STRING_t *tmp) { + const uint8_t *b; + union { + const uint8_t *c_buf; + uint8_t *nc_buf; + } unconst; + + if(st->size == 0) { + assert(st->bits_unused == 0); + return st; + } else { + for(b = &st->buf[st->size - 1]; b > st->buf && *b == 0; b--) { + ; + } + /* b points to the last byte which may contain data */ + if(*b) { + int unused = 7; + uint8_t v = *b; + v &= -(int8_t)v; + if(v & 0x0F) unused -= 4; + if(v & 0x33) unused -= 2; + if(v & 0x55) unused -= 1; + tmp->size = b-st->buf + 1; + tmp->bits_unused = unused; + } else { + tmp->size = b-st->buf; + tmp->bits_unused = 0; + } + + assert(b >= st->buf); + } + + unconst.c_buf = st->buf; + tmp->buf = unconst.nc_buf; + return tmp; +} + +/* + * Lexicographically compare the common prefix of both strings, + * and if it is the same return -1 for the smallest string. + */ +int +BIT_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + /* + * Remove information about trailing bits, since + * X.680 (08/2015) #22.7 "ensure that different semantics are not" + * "associated with [values that differ only in] the trailing 0 bits." + */ + BIT_STRING_t compact_a, compact_b; + const BIT_STRING_t *a = BIT_STRING__compactify(aptr, &compact_a); + const BIT_STRING_t *b = BIT_STRING__compactify(bptr, &compact_b); + const asn_OCTET_STRING_specifics_t *specs = td->specifics; + + assert(specs && specs->subvariant == ASN_OSUBV_BIT); + + if(a && b) { + size_t common_prefix_size = a->size <= b->size ? a->size : b->size; + int ret = memcmp(a->buf, b->buf, common_prefix_size); + if(ret == 0) { + /* Figure out which string with equal prefixes is longer. */ + if(a->size < b->size) { + return -1; + } else if(a->size > b->size) { + return 1; + } else { + /* Figure out how many unused bits */ + if(a->bits_unused > b->bits_unused) { + return -1; + } else if(a->bits_unused < b->bits_unused) { + return 1; + } else { + return 0; + } + } + } else { + return ret; + } + } else if(!a && !b) { + return 0; + } else if(!a) { + return -1; + } else { + return 1; + } +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +static asn_per_constraint_t asn_DEF_BIT_STRING_constraint_size = { + APC_SEMI_CONSTRAINED, -1, -1, 0, 0}; + +asn_dec_rval_t +BIT_STRING_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_BIT_STRING_specs; + const asn_per_constraints_t *pc = + constraints ? constraints : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *csiz; + asn_dec_rval_t rval = { RC_OK, 0 }; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + ssize_t consumed_myself = 0; + int repeat; + + (void)opt_codec_ctx; + + if(pc) { + csiz = &pc->size; + } else { + csiz = &asn_DEF_BIT_STRING_constraint_size; + } + + if(specs->subvariant != ASN_OSUBV_BIT) { + ASN_DEBUG("Subvariant %d is not BIT OSUBV_BIT", specs->subvariant); + RETURN(RC_FAIL); + } + + /* + * Allocate the string. + */ + if(!st) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); + + if(csiz->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) RETURN(RC_WMORE); + if(inext) { + csiz = &asn_DEF_BIT_STRING_constraint_size; + } + } + + if(csiz->effective_bits >= 0) { + FREEMEM(st->buf); + st->size = (csiz->upper_bound + 7) >> 3; + st->buf = (uint8_t *)MALLOC(st->size + 1); + if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits == 0) { + int ret; + ASN_DEBUG("Encoding BIT STRING size %ld", csiz->upper_bound); + ret = per_get_many_bits(pd, st->buf, 0, csiz->upper_bound); + if(ret < 0) RETURN(RC_WMORE); + consumed_myself += csiz->upper_bound; + st->buf[st->size] = 0; + st->bits_unused = (8 - (csiz->upper_bound & 0x7)) & 0x7; + RETURN(RC_OK); + } + + st->size = 0; + do { + ssize_t raw_len; + ssize_t len_bytes; + ssize_t len_bits; + void *p; + int ret; + + /* Get the PER length */ + raw_len = uper_get_length(pd, csiz->effective_bits, csiz->lower_bound, + &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", + (long)csiz->effective_bits, (long)raw_len, + repeat ? "repeat" : "once", td->name); + len_bits = raw_len; + len_bytes = (len_bits + 7) >> 3; + if(len_bits & 0x7) st->bits_unused = 8 - (len_bits & 0x7); + /* len_bits be multiple of 16K if repeat is set */ + p = REALLOC(st->buf, st->size + len_bytes + 1); + if(!p) RETURN(RC_FAIL); + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, len_bits); + if(ret < 0) RETURN(RC_WMORE); + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + return rval; +} + +asn_enc_rval_t +BIT_STRING_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_BIT_STRING_specs; + const asn_per_constraints_t *pc = + constraints ? constraints : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *csiz; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + BIT_STRING_t compact_bstr; /* Do not modify this directly! */ + asn_enc_rval_t er = { 0, 0, 0 }; + int inext = 0; /* Lies not within extension root */ + size_t size_in_bits; + const uint8_t *buf; + int ret; + int ct_extensible; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + if(specs->subvariant == ASN_OSUBV_BIT) { + if((st->size == 0 && st->bits_unused) || (st->bits_unused & ~7)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + + if(pc) { + csiz = &pc->size; + } else { + csiz = &asn_DEF_BIT_STRING_constraint_size; + } + ct_extensible = csiz->flags & APC_EXTENSIBLE; + + /* Figure out the size without the trailing bits */ + st = BIT_STRING__compactify(st, &compact_bstr); + size_in_bits = 8 * st->size - st->bits_unused; + + ASN_DEBUG( + "Encoding %s into %" ASN_PRI_SIZE " bits" + " (%ld..%ld, effective %d)%s", + td->name, size_in_bits, csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, ct_extensible ? " EXT" : ""); + + /* Figure out whether size lies within PER visible constraint */ + + if(csiz->effective_bits >= 0) { + if((ssize_t)size_in_bits > csiz->upper_bound) { + if(ct_extensible) { + csiz = &asn_DEF_BIT_STRING_constraint_size; + inext = 1; + } else { + ASN__ENCODE_FAILED; + } + } + } else { + inext = 0; + } + + if(ct_extensible) { + /* Declare whether length is [not] within extension root */ + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + } + + if(csiz->effective_bits >= 0 && !inext) { + int add_trailer = (ssize_t)size_in_bits < csiz->lower_bound; + ASN_DEBUG( + "Encoding %" ASN_PRI_SIZE " bytes (%ld), length (in %d bits) trailer %d; actual " + "value %" ASN_PRI_SSIZE "", + st->size, size_in_bits - csiz->lower_bound, csiz->effective_bits, + add_trailer, + add_trailer ? 0 : (ssize_t)size_in_bits - csiz->lower_bound); + ret = per_put_few_bits( + po, add_trailer ? 0 : (ssize_t)size_in_bits - csiz->lower_bound, + csiz->effective_bits); + if(ret) ASN__ENCODE_FAILED; + ret = per_put_many_bits(po, st->buf, size_in_bits); + if(ret) ASN__ENCODE_FAILED; + if(add_trailer) { + static const uint8_t zeros[16]; + size_t trailing_zero_bits = csiz->lower_bound - size_in_bits; + while(trailing_zero_bits > 0) { + if(trailing_zero_bits > 8 * sizeof(zeros)) { + ret = per_put_many_bits(po, zeros, 8 * sizeof(zeros)); + trailing_zero_bits -= 8 * sizeof(zeros); + } else { + ret = per_put_many_bits(po, zeros, trailing_zero_bits); + trailing_zero_bits = 0; + } + if(ret) ASN__ENCODE_FAILED; + } + } + ASN__ENCODED_OK(er); + } + + ASN_DEBUG("Encoding %" ASN_PRI_SIZE " bytes", st->size); + + buf = st->buf; + do { + int need_eom = 0; + ssize_t maySave = uper_put_length(po, size_in_bits, &need_eom); + if(maySave < 0) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %" ASN_PRI_SSIZE " of %" ASN_PRI_SIZE "", maySave, size_in_bits); + + ret = per_put_many_bits(po, buf, maySave); + if(ret) ASN__ENCODE_FAILED; + + buf += maySave >> 3; + size_in_bits -= maySave; + assert(!(maySave & 0x07) || !size_in_bits); + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size_in_bits); + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +asn_random_fill_result_t +BIT_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_BIT_STRING_specs; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + static unsigned lengths[] = {0, 1, 2, 3, 4, 8, + 126, 127, 128, 16383, 16384, 16385, + 65534, 65535, 65536, 65537}; + uint8_t *buf; + uint8_t *bend; + uint8_t *b; + size_t rnd_bits, rnd_len; + BIT_STRING_t *st; + + if(max_length == 0) return result_skipped; + + switch(specs->subvariant) { + case ASN_OSUBV_ANY: + return result_failed; + case ASN_OSUBV_BIT: + break; + default: + break; + } + + /* Figure out how far we should go */ + rnd_bits = lengths[asn_random_between( + 0, sizeof(lengths) / sizeof(lengths[0]) - 1)]; + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->size; + if(pc->flags & APC_CONSTRAINED) { + long suggested_upper_bound = pc->upper_bound < (ssize_t)max_length + ? pc->upper_bound + : (ssize_t)max_length; + if(max_length < (size_t)pc->lower_bound) { + return result_skipped; + } + if(pc->flags & APC_EXTENSIBLE) { + switch(asn_random_between(0, 5)) { + case 0: + if(pc->lower_bound > 0) { + rnd_bits = pc->lower_bound - 1; + break; + } + /* Fall through */ + case 1: + rnd_bits = pc->upper_bound + 1; + break; + case 2: + /* Keep rnd_bits from the table */ + if(rnd_bits < max_length) { + break; + } + /* Fall through */ + default: + rnd_bits = asn_random_between(pc->lower_bound, + suggested_upper_bound); + } + } else { + rnd_bits = + asn_random_between(pc->lower_bound, suggested_upper_bound); + } + } else { + rnd_bits = asn_random_between(0, max_length - 1); + } + } else if(rnd_bits >= max_length) { + rnd_bits = asn_random_between(0, max_length - 1); + } + + rnd_len = (rnd_bits + 7) / 8; + buf = CALLOC(1, rnd_len + 1); + if(!buf) return result_failed; + + bend = &buf[rnd_len]; + + for(b = buf; b < bend; b++) { + *(uint8_t *)b = asn_random_between(0, 255); + } + *b = 0; /* Zero-terminate just in case. */ + + if(*sptr) { + st = *sptr; + FREEMEM(st->buf); + } else { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) { + FREEMEM(buf); + return result_failed; + } + } + + st->buf = buf; + st->size = rnd_len; + st->bits_unused = (8 - (rnd_bits & 0x7)) & 0x7; + if(st->bits_unused) { + assert(st->size > 0); + st->buf[st->size-1] &= 0xff << st->bits_unused; + } + + result_ok.length = st->size; + return result_ok; +} diff --git a/src/codec_utils/E2SMKPM/BIT_STRING.h b/src/codec_utils/E2SMKPM/BIT_STRING.h new file mode 100644 index 000000000..c1bdbbcfb --- /dev/null +++ b/src/codec_utils/E2SMKPM/BIT_STRING.h @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BIT_STRING_H_ +#define _BIT_STRING_H_ + +#include /* Some help from OCTET STRING */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct BIT_STRING_s { + uint8_t *buf; /* BIT STRING body */ + size_t size; /* Size of the above buffer */ + + int bits_unused;/* Unused trailing bits in the last octet (0..7) */ + + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ +} BIT_STRING_t; + +extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; +extern asn_TYPE_operation_t asn_OP_BIT_STRING; +extern asn_OCTET_STRING_specifics_t asn_SPC_BIT_STRING_specs; + +asn_struct_print_f BIT_STRING_print; /* Human-readable output */ +asn_struct_compare_f BIT_STRING_compare; +asn_constr_check_f BIT_STRING_constraint; +xer_type_encoder_f BIT_STRING_encode_xer; +oer_type_decoder_f BIT_STRING_decode_oer; +oer_type_encoder_f BIT_STRING_encode_oer; +per_type_decoder_f BIT_STRING_decode_uper; +per_type_encoder_f BIT_STRING_encode_uper; +asn_random_fill_f BIT_STRING_random_fill; + +#define BIT_STRING_free OCTET_STRING_free +#define BIT_STRING_decode_ber OCTET_STRING_decode_ber +#define BIT_STRING_encode_der OCTET_STRING_encode_der +#define BIT_STRING_decode_xer OCTET_STRING_decode_xer_binary +#define BIT_STRING_decode_aper OCTET_STRING_decode_aper +#define BIT_STRING_encode_aper OCTET_STRING_encode_aper + +#ifdef __cplusplus +} +#endif + +#endif /* _BIT_STRING_H_ */ diff --git a/src/codec_utils/E2SMKPM/BIT_STRING_oer.c b/src/codec_utils/E2SMKPM/BIT_STRING_oer.c new file mode 100644 index 000000000..aff5075cd --- /dev/null +++ b/src/codec_utils/E2SMKPM/BIT_STRING_oer.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +BIT_STRING_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **sptr, + const void *ptr, size_t size) { + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + const asn_oer_constraints_t *cts = + constraints ? constraints : td->encoding_constraints.oer_constraints; + ssize_t ct_size = cts ? cts->size : -1; + asn_dec_rval_t rval = {RC_OK, 0}; + size_t expected_length = 0; + + (void)opt_codec_ctx; + + if(!st) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + if(ct_size >= 0) { + expected_length = (ct_size + 7) >> 3; + st->bits_unused = (8 - (ct_size & 7)) & 7; + } else { + /* + * X.696 (08/2015) #13.3.1 + * Encode length determinant as _number of octets_, but only + * if upper bound is not equal to lower bound. + */ + ssize_t len_len = oer_fetch_length(ptr, size, &expected_length); + if(len_len > 0) { + ptr = (const char *)ptr + len_len; + size -= len_len; + } else if(len_len == 0) { + ASN__DECODE_STARVED; + } else if(len_len < 0) { + ASN__DECODE_FAILED; + } + + if(expected_length < 1) { + ASN__DECODE_FAILED; + } else if(expected_length > size) { + ASN__DECODE_STARVED; + } + + st->bits_unused = ((const uint8_t *)ptr)[0]; + if(st->bits_unused & ~7) { + ASN_DEBUG("%s: unused bits outside of 0..7 range", td->name); + ASN__DECODE_FAILED; + } + ptr = (const char *)ptr + 1; + size--; + expected_length--; + rval.consumed = len_len + 1; + } + + if(size < expected_length) { + ASN__DECODE_STARVED; + } else { + uint8_t *buf = MALLOC(expected_length + 1); + if(buf == NULL) { + ASN__DECODE_FAILED; + } else { + memcpy(buf, ptr, expected_length); + buf[expected_length] = '\0'; + } + FREEMEM(st->buf); + st->buf = buf; + st->size = expected_length; + if(expected_length > 0) { + buf[expected_length - 1] &= (0xff << st->bits_unused); + } + + rval.consumed += expected_length; + return rval; + } +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +BIT_STRING_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + asn_enc_rval_t erval = {0, 0, 0}; + const asn_oer_constraints_t *cts = + constraints ? constraints : td->encoding_constraints.oer_constraints; + ssize_t ct_size = cts ? cts->size : -1; + size_t trailing_zeros = 0; + int fix_last_byte = 0; + + if(!st) ASN__ENCODE_FAILED; + + if(st->bits_unused & ~7) { + ASN_DEBUG("BIT STRING unused bits %d out of 0..7 range", + st->bits_unused); + ASN__ENCODE_FAILED; + } + if(st->bits_unused && !(st->size && st->buf)) { + ASN_DEBUG("BIT STRING %s size 0 can't support unused bits %d", td->name, + st->bits_unused); + ASN__ENCODE_FAILED; + } + + if(ct_size >= 0) { + size_t ct_bytes = (ct_size + 7) >> 3; + if(st->size > ct_bytes) { + ASN_DEBUG("More bits in BIT STRING %s (%" ASN_PRI_SSIZE ") than constrained %" ASN_PRI_SSIZE "", + td->name, 8 * st->size - st->bits_unused, ct_size); + ASN__ENCODE_FAILED; + } + trailing_zeros = ct_bytes - st->size; /* Allow larger constraint */ + } else { + uint8_t ub = st->bits_unused & 7; + ssize_t len_len = oer_serialize_length(1 + st->size, cb, app_key); + if(len_len < 0) ASN__ENCODE_FAILED; + if(cb(&ub, 1, app_key) < 0) { + ASN__ENCODE_FAILED; + } + erval.encoded += len_len + 1; + } + + if(st->bits_unused) { + if(st->buf[st->size - 1] & (0xff << st->bits_unused)) { + fix_last_byte = 1; + } + } + + if(cb(st->buf, st->size - fix_last_byte, app_key) < 0) { + ASN__ENCODE_FAILED; + } + + if(fix_last_byte) { + uint8_t b = st->buf[st->size - 1] & (0xff << st->bits_unused); + if(cb(&b, 1, app_key) < 0) { + ASN__ENCODE_FAILED; + } + } + + erval.encoded += st->size; + + if(trailing_zeros) { + static uint8_t zeros[16]; + while(trailing_zeros > 0) { + int ret; + if(trailing_zeros < sizeof(zeros)) { + ret = cb(zeros, trailing_zeros, app_key); + erval.encoded += trailing_zeros; + } else { + ret = cb(zeros, sizeof(zeros), app_key); + erval.encoded += sizeof(zeros); + } + if(ret < 0) ASN__ENCODE_FAILED; + } + } + + return erval; +} + + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.c b/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.c new file mode 100644 index 000000000..62de02290 --- /dev/null +++ b/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CUUPMeasurement-Container.h" + +#include "PlmnID-List.h" +static int +memb_plmnList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 12)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_plmnList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..12)) */}; +static asn_per_constraints_t asn_PER_type_plmnList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 12 } /* (SIZE(1..12)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_plmnList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..12)) */}; +static asn_per_constraints_t asn_PER_memb_plmnList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 12 } /* (SIZE(1..12)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_plmnList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_PlmnID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_plmnList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_plmnList_specs_2 = { + sizeof(struct CUUPMeasurement_Container__plmnList), + offsetof(struct CUUPMeasurement_Container__plmnList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_plmnList_2 = { + "plmnList", + "plmnList", + &asn_OP_SEQUENCE_OF, + asn_DEF_plmnList_tags_2, + sizeof(asn_DEF_plmnList_tags_2) + /sizeof(asn_DEF_plmnList_tags_2[0]) - 1, /* 1 */ + asn_DEF_plmnList_tags_2, /* Same as above */ + sizeof(asn_DEF_plmnList_tags_2) + /sizeof(asn_DEF_plmnList_tags_2[0]), /* 2 */ + { &asn_OER_type_plmnList_constr_2, &asn_PER_type_plmnList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_plmnList_2, + 1, /* Single element */ + &asn_SPC_plmnList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_CUUPMeasurement_Container_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CUUPMeasurement_Container, plmnList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_plmnList_2, + 0, + { &asn_OER_memb_plmnList_constr_2, &asn_PER_memb_plmnList_constr_2, memb_plmnList_constraint_1 }, + 0, 0, /* No default value */ + "plmnList" + }, +}; +static const ber_tlv_tag_t asn_DEF_CUUPMeasurement_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CUUPMeasurement_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* plmnList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_CUUPMeasurement_Container_specs_1 = { + sizeof(struct CUUPMeasurement_Container), + offsetof(struct CUUPMeasurement_Container, _asn_ctx), + asn_MAP_CUUPMeasurement_Container_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CUUPMeasurement_Container = { + "CUUPMeasurement-Container", + "CUUPMeasurement-Container", + &asn_OP_SEQUENCE, + asn_DEF_CUUPMeasurement_Container_tags_1, + sizeof(asn_DEF_CUUPMeasurement_Container_tags_1) + /sizeof(asn_DEF_CUUPMeasurement_Container_tags_1[0]), /* 1 */ + asn_DEF_CUUPMeasurement_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_CUUPMeasurement_Container_tags_1) + /sizeof(asn_DEF_CUUPMeasurement_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CUUPMeasurement_Container_1, + 1, /* Elements count */ + &asn_SPC_CUUPMeasurement_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.h b/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.h new file mode 100644 index 000000000..99bb5f586 --- /dev/null +++ b/src/codec_utils/E2SMKPM/CUUPMeasurement-Container.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CUUPMeasurement_Container_H_ +#define _CUUPMeasurement_Container_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PlmnID_List; + +/* CUUPMeasurement-Container */ +typedef struct CUUPMeasurement_Container { + struct CUUPMeasurement_Container__plmnList { + A_SEQUENCE_OF(struct PlmnID_List) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } plmnList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CUUPMeasurement_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CUUPMeasurement_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_CUUPMeasurement_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_CUUPMeasurement_Container_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _CUUPMeasurement_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/CellResourceReportListItem.c b/src/codec_utils/E2SMKPM/CellResourceReportListItem.c new file mode 100644 index 000000000..528002c0e --- /dev/null +++ b/src/codec_utils/E2SMKPM/CellResourceReportListItem.c @@ -0,0 +1,228 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CellResourceReportListItem.h" + +#include "ServedPlmnPerCellListItem.h" +static int +memb_dl_TotalofAvailablePRBs_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 273)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ul_TotalofAvailablePRBs_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 273)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_servedPlmnPerCellList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 12)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_servedPlmnPerCellList_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..12)) */}; +static asn_per_constraints_t asn_PER_type_servedPlmnPerCellList_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 12 } /* (SIZE(1..12)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_dl_TotalofAvailablePRBs_constr_3 CC_NOTUSED = { + { 2, 1 } /* (0..273) */, + -1}; +static asn_per_constraints_t asn_PER_memb_dl_TotalofAvailablePRBs_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 9, 9, 0, 273 } /* (0..273) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ul_TotalofAvailablePRBs_constr_4 CC_NOTUSED = { + { 2, 1 } /* (0..273) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ul_TotalofAvailablePRBs_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED, 9, 9, 0, 273 } /* (0..273) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_servedPlmnPerCellList_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..12)) */}; +static asn_per_constraints_t asn_PER_memb_servedPlmnPerCellList_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 12 } /* (SIZE(1..12)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_servedPlmnPerCellList_5[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ServedPlmnPerCellListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_servedPlmnPerCellList_tags_5[] = { + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_servedPlmnPerCellList_specs_5 = { + sizeof(struct CellResourceReportListItem__servedPlmnPerCellList), + offsetof(struct CellResourceReportListItem__servedPlmnPerCellList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_servedPlmnPerCellList_5 = { + "servedPlmnPerCellList", + "servedPlmnPerCellList", + &asn_OP_SEQUENCE_OF, + asn_DEF_servedPlmnPerCellList_tags_5, + sizeof(asn_DEF_servedPlmnPerCellList_tags_5) + /sizeof(asn_DEF_servedPlmnPerCellList_tags_5[0]) - 1, /* 1 */ + asn_DEF_servedPlmnPerCellList_tags_5, /* Same as above */ + sizeof(asn_DEF_servedPlmnPerCellList_tags_5) + /sizeof(asn_DEF_servedPlmnPerCellList_tags_5[0]), /* 2 */ + { &asn_OER_type_servedPlmnPerCellList_constr_5, &asn_PER_type_servedPlmnPerCellList_constr_5, SEQUENCE_OF_constraint }, + asn_MBR_servedPlmnPerCellList_5, + 1, /* Single element */ + &asn_SPC_servedPlmnPerCellList_specs_5 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_CellResourceReportListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CellResourceReportListItem, nRCGI), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NRCGI, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "nRCGI" + }, + { ATF_POINTER, 2, offsetof(struct CellResourceReportListItem, dl_TotalofAvailablePRBs), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_dl_TotalofAvailablePRBs_constr_3, &asn_PER_memb_dl_TotalofAvailablePRBs_constr_3, memb_dl_TotalofAvailablePRBs_constraint_1 }, + 0, 0, /* No default value */ + "dl-TotalofAvailablePRBs" + }, + { ATF_POINTER, 1, offsetof(struct CellResourceReportListItem, ul_TotalofAvailablePRBs), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ul_TotalofAvailablePRBs_constr_4, &asn_PER_memb_ul_TotalofAvailablePRBs_constr_4, memb_ul_TotalofAvailablePRBs_constraint_1 }, + 0, 0, /* No default value */ + "ul-TotalofAvailablePRBs" + }, + { ATF_NOFLAGS, 0, offsetof(struct CellResourceReportListItem, servedPlmnPerCellList), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + 0, + &asn_DEF_servedPlmnPerCellList_5, + 0, + { &asn_OER_memb_servedPlmnPerCellList_constr_5, &asn_PER_memb_servedPlmnPerCellList_constr_5, memb_servedPlmnPerCellList_constraint_1 }, + 0, 0, /* No default value */ + "servedPlmnPerCellList" + }, +}; +static const int asn_MAP_CellResourceReportListItem_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_CellResourceReportListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CellResourceReportListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nRCGI */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dl-TotalofAvailablePRBs */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ul-TotalofAvailablePRBs */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* servedPlmnPerCellList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_CellResourceReportListItem_specs_1 = { + sizeof(struct CellResourceReportListItem), + offsetof(struct CellResourceReportListItem, _asn_ctx), + asn_MAP_CellResourceReportListItem_tag2el_1, + 4, /* Count of tags in the map */ + asn_MAP_CellResourceReportListItem_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 4, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CellResourceReportListItem = { + "CellResourceReportListItem", + "CellResourceReportListItem", + &asn_OP_SEQUENCE, + asn_DEF_CellResourceReportListItem_tags_1, + sizeof(asn_DEF_CellResourceReportListItem_tags_1) + /sizeof(asn_DEF_CellResourceReportListItem_tags_1[0]), /* 1 */ + asn_DEF_CellResourceReportListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_CellResourceReportListItem_tags_1) + /sizeof(asn_DEF_CellResourceReportListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CellResourceReportListItem_1, + 4, /* Elements count */ + &asn_SPC_CellResourceReportListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/CellResourceReportListItem.h b/src/codec_utils/E2SMKPM/CellResourceReportListItem.h new file mode 100644 index 000000000..d6c316f85 --- /dev/null +++ b/src/codec_utils/E2SMKPM/CellResourceReportListItem.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CellResourceReportListItem_H_ +#define _CellResourceReportListItem_H_ + + +#include + +/* Including external dependencies */ +#include "NRCGI.h" +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ServedPlmnPerCellListItem; + +/* CellResourceReportListItem */ +typedef struct CellResourceReportListItem { + NRCGI_t nRCGI; + long *dl_TotalofAvailablePRBs; /* OPTIONAL */ + long *ul_TotalofAvailablePRBs; /* OPTIONAL */ + struct CellResourceReportListItem__servedPlmnPerCellList { + A_SEQUENCE_OF(struct ServedPlmnPerCellListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } servedPlmnPerCellList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CellResourceReportListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CellResourceReportListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_CellResourceReportListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_CellResourceReportListItem_1[4]; + +#ifdef __cplusplus +} +#endif + +#endif /* _CellResourceReportListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.c b/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.c new file mode 100644 index 000000000..ef48c85bd --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-ActionDefinition.h" + +static asn_TYPE_member_t asn_MBR_E2SM_KPM_ActionDefinition_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_ActionDefinition, ric_Style_Type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-Style-Type" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2SM_KPM_ActionDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_ActionDefinition_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ric-Style-Type */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_ActionDefinition_specs_1 = { + sizeof(struct E2SM_KPM_ActionDefinition), + offsetof(struct E2SM_KPM_ActionDefinition, _asn_ctx), + asn_MAP_E2SM_KPM_ActionDefinition_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition = { + "E2SM-KPM-ActionDefinition", + "E2SM-KPM-ActionDefinition", + &asn_OP_SEQUENCE, + asn_DEF_E2SM_KPM_ActionDefinition_tags_1, + sizeof(asn_DEF_E2SM_KPM_ActionDefinition_tags_1) + /sizeof(asn_DEF_E2SM_KPM_ActionDefinition_tags_1[0]), /* 1 */ + asn_DEF_E2SM_KPM_ActionDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_E2SM_KPM_ActionDefinition_tags_1) + /sizeof(asn_DEF_E2SM_KPM_ActionDefinition_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2SM_KPM_ActionDefinition_1, + 1, /* Elements count */ + &asn_SPC_E2SM_KPM_ActionDefinition_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.h b/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.h new file mode 100644 index 000000000..7c28c1416 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-ActionDefinition.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_ActionDefinition_H_ +#define _E2SM_KPM_ActionDefinition_H_ + + +#include + +/* Including external dependencies */ +#include "RIC-Style-Type.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2SM-KPM-ActionDefinition */ +typedef struct E2SM_KPM_ActionDefinition { + RIC_Style_Type_t ric_Style_Type; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_ActionDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_ActionDefinition; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_ActionDefinition_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.c b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.c new file mode 100644 index 000000000..95a6c90ac --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.c @@ -0,0 +1,132 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-EventTriggerDefinition-Format1.h" + +#include "Trigger-ConditionIE-Item.h" +static int +memb_policyTest_List_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 15)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_policyTest_List_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..15)) */}; +static asn_per_constraints_t asn_PER_type_policyTest_List_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 15 } /* (SIZE(1..15)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_policyTest_List_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..15)) */}; +static asn_per_constraints_t asn_PER_memb_policyTest_List_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 15 } /* (SIZE(1..15)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_policyTest_List_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_Trigger_ConditionIE_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_policyTest_List_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_policyTest_List_specs_2 = { + sizeof(struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List), + offsetof(struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_policyTest_List_2 = { + "policyTest-List", + "policyTest-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_policyTest_List_tags_2, + sizeof(asn_DEF_policyTest_List_tags_2) + /sizeof(asn_DEF_policyTest_List_tags_2[0]) - 1, /* 1 */ + asn_DEF_policyTest_List_tags_2, /* Same as above */ + sizeof(asn_DEF_policyTest_List_tags_2) + /sizeof(asn_DEF_policyTest_List_tags_2[0]), /* 2 */ + { &asn_OER_type_policyTest_List_constr_2, &asn_PER_type_policyTest_List_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_policyTest_List_2, + 1, /* Single element */ + &asn_SPC_policyTest_List_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2SM_KPM_EventTriggerDefinition_Format1_1[] = { + { ATF_POINTER, 1, offsetof(struct E2SM_KPM_EventTriggerDefinition_Format1, policyTest_List), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_policyTest_List_2, + 0, + { &asn_OER_memb_policyTest_List_constr_2, &asn_PER_memb_policyTest_List_constr_2, memb_policyTest_List_constraint_1 }, + 0, 0, /* No default value */ + "policyTest-List" + }, +}; +static const int asn_MAP_E2SM_KPM_EventTriggerDefinition_Format1_oms_1[] = { 0 }; +static const ber_tlv_tag_t asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_EventTriggerDefinition_Format1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* policyTest-List */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_EventTriggerDefinition_Format1_specs_1 = { + sizeof(struct E2SM_KPM_EventTriggerDefinition_Format1), + offsetof(struct E2SM_KPM_EventTriggerDefinition_Format1, _asn_ctx), + asn_MAP_E2SM_KPM_EventTriggerDefinition_Format1_tag2el_1, + 1, /* Count of tags in the map */ + asn_MAP_E2SM_KPM_EventTriggerDefinition_Format1_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1 = { + "E2SM-KPM-EventTriggerDefinition-Format1", + "E2SM-KPM-EventTriggerDefinition-Format1", + &asn_OP_SEQUENCE, + asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1, + sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1[0]), /* 1 */ + asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2SM_KPM_EventTriggerDefinition_Format1_1, + 1, /* Elements count */ + &asn_SPC_E2SM_KPM_EventTriggerDefinition_Format1_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.h b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.h new file mode 100644 index 000000000..ed7f90dc4 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition-Format1.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_EventTriggerDefinition_Format1_H_ +#define _E2SM_KPM_EventTriggerDefinition_Format1_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct Trigger_ConditionIE_Item; + +/* E2SM-KPM-EventTriggerDefinition-Format1 */ +typedef struct E2SM_KPM_EventTriggerDefinition_Format1 { + struct E2SM_KPM_EventTriggerDefinition_Format1__policyTest_List { + A_SEQUENCE_OF(struct Trigger_ConditionIE_Item) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } *policyTest_List; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_EventTriggerDefinition_Format1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_EventTriggerDefinition_Format1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2SM_KPM_EventTriggerDefinition_Format1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_EventTriggerDefinition_Format1_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.c b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.c new file mode 100644 index 000000000..b50ee0560 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.c @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-EventTriggerDefinition.h" + +#include "E2SM-KPM-EventTriggerDefinition-Format1.h" +static asn_oer_constraints_t asn_OER_type_E2SM_KPM_EventTriggerDefinition_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_E2SM_KPM_EventTriggerDefinition_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_E2SM_KPM_EventTriggerDefinition_1[] = { + { ATF_POINTER, 0, offsetof(struct E2SM_KPM_EventTriggerDefinition, choice.eventDefinition_Format1), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2SM_KPM_EventTriggerDefinition_Format1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eventDefinition-Format1" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_EventTriggerDefinition_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* eventDefinition-Format1 */ +}; +static asn_CHOICE_specifics_t asn_SPC_E2SM_KPM_EventTriggerDefinition_specs_1 = { + sizeof(struct E2SM_KPM_EventTriggerDefinition), + offsetof(struct E2SM_KPM_EventTriggerDefinition, _asn_ctx), + offsetof(struct E2SM_KPM_EventTriggerDefinition, present), + sizeof(((struct E2SM_KPM_EventTriggerDefinition *)0)->present), + asn_MAP_E2SM_KPM_EventTriggerDefinition_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition = { + "E2SM-KPM-EventTriggerDefinition", + "E2SM-KPM-EventTriggerDefinition", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_E2SM_KPM_EventTriggerDefinition_constr_1, &asn_PER_type_E2SM_KPM_EventTriggerDefinition_constr_1, CHOICE_constraint }, + asn_MBR_E2SM_KPM_EventTriggerDefinition_1, + 1, /* Elements count */ + &asn_SPC_E2SM_KPM_EventTriggerDefinition_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.h b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.h new file mode 100644 index 000000000..0a6a14ba1 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-EventTriggerDefinition.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_EventTriggerDefinition_H_ +#define _E2SM_KPM_EventTriggerDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2SM_KPM_EventTriggerDefinition_PR { + E2SM_KPM_EventTriggerDefinition_PR_NOTHING, /* No components present */ + E2SM_KPM_EventTriggerDefinition_PR_eventDefinition_Format1 + /* Extensions may appear below */ + +} E2SM_KPM_EventTriggerDefinition_PR; + +/* Forward declarations */ +struct E2SM_KPM_EventTriggerDefinition_Format1; + +/* E2SM-KPM-EventTriggerDefinition */ +typedef struct E2SM_KPM_EventTriggerDefinition { + E2SM_KPM_EventTriggerDefinition_PR present; + union E2SM_KPM_EventTriggerDefinition_u { + struct E2SM_KPM_EventTriggerDefinition_Format1 *eventDefinition_Format1; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_EventTriggerDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_EventTriggerDefinition; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_EventTriggerDefinition_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.c b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.c new file mode 100644 index 000000000..c8c77e625 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.c @@ -0,0 +1,171 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-IndicationHeader-Format1.h" + +#include "GlobalKPMnode-ID.h" +#include "NRCGI.h" +#include "SNSSAI.h" +static int +memb_fiveQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_qci_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_fiveQI_constr_6 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_fiveQI_constr_6 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_qci_constr_7 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_qci_constr_7 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[] = { + { ATF_POINTER, 6, offsetof(struct E2SM_KPM_IndicationHeader_Format1, id_GlobalKPMnode_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GlobalKPMnode_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "id-GlobalKPMnode-ID" + }, + { ATF_POINTER, 5, offsetof(struct E2SM_KPM_IndicationHeader_Format1, nRCGI), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NRCGI, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "nRCGI" + }, + { ATF_POINTER, 4, offsetof(struct E2SM_KPM_IndicationHeader_Format1, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_POINTER, 3, offsetof(struct E2SM_KPM_IndicationHeader_Format1, sliceID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SNSSAI, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "sliceID" + }, + { ATF_POINTER, 2, offsetof(struct E2SM_KPM_IndicationHeader_Format1, fiveQI), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_fiveQI_constr_6, &asn_PER_memb_fiveQI_constr_6, memb_fiveQI_constraint_1 }, + 0, 0, /* No default value */ + "fiveQI" + }, + { ATF_POINTER, 1, offsetof(struct E2SM_KPM_IndicationHeader_Format1, qci), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_qci_constr_7, &asn_PER_memb_qci_constr_7, memb_qci_constraint_1 }, + 0, 0, /* No default value */ + "qci" + }, +}; +static const int asn_MAP_E2SM_KPM_IndicationHeader_Format1_oms_1[] = { 0, 1, 2, 3, 4, 5 }; +static const ber_tlv_tag_t asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_IndicationHeader_Format1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id-GlobalKPMnode-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* nRCGI */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sliceID */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* fiveQI */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* qci */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_IndicationHeader_Format1_specs_1 = { + sizeof(struct E2SM_KPM_IndicationHeader_Format1), + offsetof(struct E2SM_KPM_IndicationHeader_Format1, _asn_ctx), + asn_MAP_E2SM_KPM_IndicationHeader_Format1_tag2el_1, + 6, /* Count of tags in the map */ + asn_MAP_E2SM_KPM_IndicationHeader_Format1_oms_1, /* Optional members */ + 6, 0, /* Root/Additions */ + 6, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader_Format1 = { + "E2SM-KPM-IndicationHeader-Format1", + "E2SM-KPM-IndicationHeader-Format1", + &asn_OP_SEQUENCE, + asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1, + sizeof(asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1[0]), /* 1 */ + asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_IndicationHeader_Format1_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2SM_KPM_IndicationHeader_Format1_1, + 6, /* Elements count */ + &asn_SPC_E2SM_KPM_IndicationHeader_Format1_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.h b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.h new file mode 100644 index 000000000..e72552165 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader-Format1.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_IndicationHeader_Format1_H_ +#define _E2SM_KPM_IndicationHeader_Format1_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct GlobalKPMnode_ID; +struct NRCGI; +struct SNSSAI; + +/* E2SM-KPM-IndicationHeader-Format1 */ +typedef struct E2SM_KPM_IndicationHeader_Format1 { + struct GlobalKPMnode_ID *id_GlobalKPMnode_ID; /* OPTIONAL */ + struct NRCGI *nRCGI; /* OPTIONAL */ + PLMN_Identity_t *pLMN_Identity; /* OPTIONAL */ + struct SNSSAI *sliceID; /* OPTIONAL */ + long *fiveQI; /* OPTIONAL */ + long *qci; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_IndicationHeader_Format1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader_Format1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_IndicationHeader_Format1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_Format1_1[6]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_IndicationHeader_Format1_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.c b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.c new file mode 100644 index 000000000..78c4d42a1 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.c @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-IndicationHeader.h" + +#include "E2SM-KPM-IndicationHeader-Format1.h" +static asn_oer_constraints_t asn_OER_type_E2SM_KPM_IndicationHeader_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_E2SM_KPM_IndicationHeader_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationHeader_1[] = { + { ATF_POINTER, 0, offsetof(struct E2SM_KPM_IndicationHeader, choice.indicationHeader_Format1), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2SM_KPM_IndicationHeader_Format1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "indicationHeader-Format1" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_IndicationHeader_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* indicationHeader-Format1 */ +}; +static asn_CHOICE_specifics_t asn_SPC_E2SM_KPM_IndicationHeader_specs_1 = { + sizeof(struct E2SM_KPM_IndicationHeader), + offsetof(struct E2SM_KPM_IndicationHeader, _asn_ctx), + offsetof(struct E2SM_KPM_IndicationHeader, present), + sizeof(((struct E2SM_KPM_IndicationHeader *)0)->present), + asn_MAP_E2SM_KPM_IndicationHeader_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader = { + "E2SM-KPM-IndicationHeader", + "E2SM-KPM-IndicationHeader", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_E2SM_KPM_IndicationHeader_constr_1, &asn_PER_type_E2SM_KPM_IndicationHeader_constr_1, CHOICE_constraint }, + asn_MBR_E2SM_KPM_IndicationHeader_1, + 1, /* Elements count */ + &asn_SPC_E2SM_KPM_IndicationHeader_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.h b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.h new file mode 100644 index 000000000..004205e4d --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationHeader.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_IndicationHeader_H_ +#define _E2SM_KPM_IndicationHeader_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2SM_KPM_IndicationHeader_PR { + E2SM_KPM_IndicationHeader_PR_NOTHING, /* No components present */ + E2SM_KPM_IndicationHeader_PR_indicationHeader_Format1 + /* Extensions may appear below */ + +} E2SM_KPM_IndicationHeader_PR; + +/* Forward declarations */ +struct E2SM_KPM_IndicationHeader_Format1; + +/* E2SM-KPM-IndicationHeader */ +typedef struct E2SM_KPM_IndicationHeader { + E2SM_KPM_IndicationHeader_PR present; + union E2SM_KPM_IndicationHeader_u { + struct E2SM_KPM_IndicationHeader_Format1 *indicationHeader_Format1; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_IndicationHeader_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationHeader; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_IndicationHeader_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.c b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.c new file mode 100644 index 000000000..7b486ec53 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-IndicationMessage-Format1.h" + +#include "PM-Containers-List.h" +static int +memb_pm_Containers_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 512)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_pm_Containers_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..512)) */}; +static asn_per_constraints_t asn_PER_type_pm_Containers_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 1, 512 } /* (SIZE(1..512)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pm_Containers_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..512)) */}; +static asn_per_constraints_t asn_PER_memb_pm_Containers_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 1, 512 } /* (SIZE(1..512)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_pm_Containers_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_PM_Containers_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_pm_Containers_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_pm_Containers_specs_2 = { + sizeof(struct E2SM_KPM_IndicationMessage_Format1__pm_Containers), + offsetof(struct E2SM_KPM_IndicationMessage_Format1__pm_Containers, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_pm_Containers_2 = { + "pm-Containers", + "pm-Containers", + &asn_OP_SEQUENCE_OF, + asn_DEF_pm_Containers_tags_2, + sizeof(asn_DEF_pm_Containers_tags_2) + /sizeof(asn_DEF_pm_Containers_tags_2[0]) - 1, /* 1 */ + asn_DEF_pm_Containers_tags_2, /* Same as above */ + sizeof(asn_DEF_pm_Containers_tags_2) + /sizeof(asn_DEF_pm_Containers_tags_2[0]), /* 2 */ + { &asn_OER_type_pm_Containers_constr_2, &asn_PER_type_pm_Containers_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_pm_Containers_2, + 1, /* Single element */ + &asn_SPC_pm_Containers_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format1_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_IndicationMessage_Format1, pm_Containers), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_pm_Containers_2, + 0, + { &asn_OER_memb_pm_Containers_constr_2, &asn_PER_memb_pm_Containers_constr_2, memb_pm_Containers_constraint_1 }, + 0, 0, /* No default value */ + "pm-Containers" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_IndicationMessage_Format1_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* pm-Containers */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_IndicationMessage_Format1_specs_1 = { + sizeof(struct E2SM_KPM_IndicationMessage_Format1), + offsetof(struct E2SM_KPM_IndicationMessage_Format1, _asn_ctx), + asn_MAP_E2SM_KPM_IndicationMessage_Format1_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage_Format1 = { + "E2SM-KPM-IndicationMessage-Format1", + "E2SM-KPM-IndicationMessage-Format1", + &asn_OP_SEQUENCE, + asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1, + sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1[0]), /* 1 */ + asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1, /* Same as above */ + sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1) + /sizeof(asn_DEF_E2SM_KPM_IndicationMessage_Format1_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2SM_KPM_IndicationMessage_Format1_1, + 1, /* Elements count */ + &asn_SPC_E2SM_KPM_IndicationMessage_Format1_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.h b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.h new file mode 100644 index 000000000..59f719d35 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage-Format1.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_IndicationMessage_Format1_H_ +#define _E2SM_KPM_IndicationMessage_Format1_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PM_Containers_List; + +/* E2SM-KPM-IndicationMessage-Format1 */ +typedef struct E2SM_KPM_IndicationMessage_Format1 { + struct E2SM_KPM_IndicationMessage_Format1__pm_Containers { + A_SEQUENCE_OF(struct PM_Containers_List) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } pm_Containers; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_IndicationMessage_Format1_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage_Format1; +extern asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_IndicationMessage_Format1_specs_1; +extern asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_Format1_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_IndicationMessage_Format1_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.c b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.c new file mode 100644 index 000000000..fe7d595ef --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-IndicationMessage.h" + +#include "E2SM-KPM-IndicationMessage-Format1.h" +static asn_oer_constraints_t asn_OER_type_E2SM_KPM_IndicationMessage_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_E2SM_KPM_IndicationMessage_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_E2SM_KPM_IndicationMessage_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_IndicationMessage, choice.ric_Style_Type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-Style-Type" + }, + { ATF_POINTER, 0, offsetof(struct E2SM_KPM_IndicationMessage, choice.indicationMessage_Format1), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_E2SM_KPM_IndicationMessage_Format1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "indicationMessage-Format1" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_IndicationMessage_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ric-Style-Type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* indicationMessage-Format1 */ +}; +static asn_CHOICE_specifics_t asn_SPC_E2SM_KPM_IndicationMessage_specs_1 = { + sizeof(struct E2SM_KPM_IndicationMessage), + offsetof(struct E2SM_KPM_IndicationMessage, _asn_ctx), + offsetof(struct E2SM_KPM_IndicationMessage, present), + sizeof(((struct E2SM_KPM_IndicationMessage *)0)->present), + asn_MAP_E2SM_KPM_IndicationMessage_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage = { + "E2SM-KPM-IndicationMessage", + "E2SM-KPM-IndicationMessage", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_E2SM_KPM_IndicationMessage_constr_1, &asn_PER_type_E2SM_KPM_IndicationMessage_constr_1, CHOICE_constraint }, + asn_MBR_E2SM_KPM_IndicationMessage_1, + 2, /* Elements count */ + &asn_SPC_E2SM_KPM_IndicationMessage_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.h b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.h new file mode 100644 index 000000000..605562879 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-IndicationMessage.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_IndicationMessage_H_ +#define _E2SM_KPM_IndicationMessage_H_ + + +#include + +/* Including external dependencies */ +#include "RIC-Style-Type.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2SM_KPM_IndicationMessage_PR { + E2SM_KPM_IndicationMessage_PR_NOTHING, /* No components present */ + E2SM_KPM_IndicationMessage_PR_ric_Style_Type, + E2SM_KPM_IndicationMessage_PR_indicationMessage_Format1 + /* Extensions may appear below */ + +} E2SM_KPM_IndicationMessage_PR; + +/* Forward declarations */ +struct E2SM_KPM_IndicationMessage_Format1; + +/* E2SM-KPM-IndicationMessage */ +typedef struct E2SM_KPM_IndicationMessage { + E2SM_KPM_IndicationMessage_PR present; + union E2SM_KPM_IndicationMessage_u { + RIC_Style_Type_t ric_Style_Type; + struct E2SM_KPM_IndicationMessage_Format1 *indicationMessage_Format1; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_IndicationMessage_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_IndicationMessage; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_IndicationMessage_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.c b/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.c new file mode 100644 index 000000000..2d9dcf1c9 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.c @@ -0,0 +1,275 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2SM-KPM-RANfunction-Description.h" + +#include "RIC-EventTriggerStyle-List.h" +#include "RIC-ReportStyle-List.h" +static int +memb_ric_EventTriggerStyle_List_constraint_3(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 63)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ric_ReportStyle_List_constraint_3(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 63)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_ric_EventTriggerStyle_List_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +static asn_per_constraints_t asn_PER_type_ric_EventTriggerStyle_List_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ric_ReportStyle_List_constr_6 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +static asn_per_constraints_t asn_PER_type_ric_ReportStyle_List_constr_6 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ric_EventTriggerStyle_List_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +static asn_per_constraints_t asn_PER_memb_ric_EventTriggerStyle_List_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ric_ReportStyle_List_constr_6 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..63)) */}; +static asn_per_constraints_t asn_PER_memb_ric_ReportStyle_List_constr_6 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 63 } /* (SIZE(1..63)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_ric_EventTriggerStyle_List_4[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RIC_EventTriggerStyle_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ric_EventTriggerStyle_List_tags_4[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_ric_EventTriggerStyle_List_specs_4 = { + sizeof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_EventTriggerStyle_List), + offsetof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_EventTriggerStyle_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_ric_EventTriggerStyle_List_4 = { + "ric-EventTriggerStyle-List", + "ric-EventTriggerStyle-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_ric_EventTriggerStyle_List_tags_4, + sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_4) + /sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_4[0]) - 1, /* 1 */ + asn_DEF_ric_EventTriggerStyle_List_tags_4, /* Same as above */ + sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_4) + /sizeof(asn_DEF_ric_EventTriggerStyle_List_tags_4[0]), /* 2 */ + { &asn_OER_type_ric_EventTriggerStyle_List_constr_4, &asn_PER_type_ric_EventTriggerStyle_List_constr_4, SEQUENCE_OF_constraint }, + asn_MBR_ric_EventTriggerStyle_List_4, + 1, /* Single element */ + &asn_SPC_ric_EventTriggerStyle_List_specs_4 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_ric_ReportStyle_List_6[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RIC_ReportStyle_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ric_ReportStyle_List_tags_6[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_ric_ReportStyle_List_specs_6 = { + sizeof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_ReportStyle_List), + offsetof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_ReportStyle_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_ric_ReportStyle_List_6 = { + "ric-ReportStyle-List", + "ric-ReportStyle-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_ric_ReportStyle_List_tags_6, + sizeof(asn_DEF_ric_ReportStyle_List_tags_6) + /sizeof(asn_DEF_ric_ReportStyle_List_tags_6[0]) - 1, /* 1 */ + asn_DEF_ric_ReportStyle_List_tags_6, /* Same as above */ + sizeof(asn_DEF_ric_ReportStyle_List_tags_6) + /sizeof(asn_DEF_ric_ReportStyle_List_tags_6[0]), /* 2 */ + { &asn_OER_type_ric_ReportStyle_List_constr_6, &asn_PER_type_ric_ReportStyle_List_constr_6, SEQUENCE_OF_constraint }, + asn_MBR_ric_ReportStyle_List_6, + 1, /* Single element */ + &asn_SPC_ric_ReportStyle_List_specs_6 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_e2SM_KPM_RANfunction_Item_3[] = { + { ATF_POINTER, 2, offsetof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item, ric_EventTriggerStyle_List), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_ric_EventTriggerStyle_List_4, + 0, + { &asn_OER_memb_ric_EventTriggerStyle_List_constr_4, &asn_PER_memb_ric_EventTriggerStyle_List_constr_4, memb_ric_EventTriggerStyle_List_constraint_3 }, + 0, 0, /* No default value */ + "ric-EventTriggerStyle-List" + }, + { ATF_POINTER, 1, offsetof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item, ric_ReportStyle_List), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_ric_ReportStyle_List_6, + 0, + { &asn_OER_memb_ric_ReportStyle_List_constr_6, &asn_PER_memb_ric_ReportStyle_List_constr_6, memb_ric_ReportStyle_List_constraint_3 }, + 0, 0, /* No default value */ + "ric-ReportStyle-List" + }, +}; +static const int asn_MAP_e2SM_KPM_RANfunction_Item_oms_3[] = { 0, 1 }; +static const ber_tlv_tag_t asn_DEF_e2SM_KPM_RANfunction_Item_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_e2SM_KPM_RANfunction_Item_tag2el_3[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ric-EventTriggerStyle-List */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ric-ReportStyle-List */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_e2SM_KPM_RANfunction_Item_specs_3 = { + sizeof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item), + offsetof(struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item, _asn_ctx), + asn_MAP_e2SM_KPM_RANfunction_Item_tag2el_3, + 2, /* Count of tags in the map */ + asn_MAP_e2SM_KPM_RANfunction_Item_oms_3, /* Optional members */ + 2, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_e2SM_KPM_RANfunction_Item_3 = { + "e2SM-KPM-RANfunction-Item", + "e2SM-KPM-RANfunction-Item", + &asn_OP_SEQUENCE, + asn_DEF_e2SM_KPM_RANfunction_Item_tags_3, + sizeof(asn_DEF_e2SM_KPM_RANfunction_Item_tags_3) + /sizeof(asn_DEF_e2SM_KPM_RANfunction_Item_tags_3[0]) - 1, /* 1 */ + asn_DEF_e2SM_KPM_RANfunction_Item_tags_3, /* Same as above */ + sizeof(asn_DEF_e2SM_KPM_RANfunction_Item_tags_3) + /sizeof(asn_DEF_e2SM_KPM_RANfunction_Item_tags_3[0]), /* 2 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_e2SM_KPM_RANfunction_Item_3, + 2, /* Elements count */ + &asn_SPC_e2SM_KPM_RANfunction_Item_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_E2SM_KPM_RANfunction_Description_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_RANfunction_Description, ranFunction_Name), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunction_Name, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunction-Name" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2SM_KPM_RANfunction_Description, e2SM_KPM_RANfunction_Item), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_e2SM_KPM_RANfunction_Item_3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "e2SM-KPM-RANfunction-Item" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2SM_KPM_RANfunction_Description_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2SM_KPM_RANfunction_Description_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunction-Name */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* e2SM-KPM-RANfunction-Item */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_E2SM_KPM_RANfunction_Description_specs_1 = { + sizeof(struct E2SM_KPM_RANfunction_Description), + offsetof(struct E2SM_KPM_RANfunction_Description, _asn_ctx), + asn_MAP_E2SM_KPM_RANfunction_Description_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_RANfunction_Description = { + "E2SM-KPM-RANfunction-Description", + "E2SM-KPM-RANfunction-Description", + &asn_OP_SEQUENCE, + asn_DEF_E2SM_KPM_RANfunction_Description_tags_1, + sizeof(asn_DEF_E2SM_KPM_RANfunction_Description_tags_1) + /sizeof(asn_DEF_E2SM_KPM_RANfunction_Description_tags_1[0]), /* 1 */ + asn_DEF_E2SM_KPM_RANfunction_Description_tags_1, /* Same as above */ + sizeof(asn_DEF_E2SM_KPM_RANfunction_Description_tags_1) + /sizeof(asn_DEF_E2SM_KPM_RANfunction_Description_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2SM_KPM_RANfunction_Description_1, + 2, /* Elements count */ + &asn_SPC_E2SM_KPM_RANfunction_Description_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.h b/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.h new file mode 100644 index 000000000..af0978dd5 --- /dev/null +++ b/src/codec_utils/E2SMKPM/E2SM-KPM-RANfunction-Description.h @@ -0,0 +1,69 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2SM_KPM_RANfunction_Description_H_ +#define _E2SM_KPM_RANfunction_Description_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunction-Name.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RIC_EventTriggerStyle_List; +struct RIC_ReportStyle_List; + +/* E2SM-KPM-RANfunction-Description */ +typedef struct E2SM_KPM_RANfunction_Description { + RANfunction_Name_t ranFunction_Name; + struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item { + struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_EventTriggerStyle_List { + A_SEQUENCE_OF(struct RIC_EventTriggerStyle_List) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } *ric_EventTriggerStyle_List; + struct E2SM_KPM_RANfunction_Description__e2SM_KPM_RANfunction_Item__ric_ReportStyle_List { + A_SEQUENCE_OF(struct RIC_ReportStyle_List) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } *ric_ReportStyle_List; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } e2SM_KPM_RANfunction_Item; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2SM_KPM_RANfunction_Description_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2SM_KPM_RANfunction_Description; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2SM_KPM_RANfunction_Description_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/ENB-ID-Choice.c b/src/codec_utils/E2SMKPM/ENB-ID-Choice.c new file mode 100644 index 000000000..ac27f00df --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENB-ID-Choice.c @@ -0,0 +1,192 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID-Choice.h" + +static int +memb_enb_ID_macro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_shortmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_macro), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_macro_constr_2, &asn_PER_memb_enb_ID_macro_constr_2, memb_enb_ID_macro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-macro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_shortmacro), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_shortmacro_constr_3, &asn_PER_memb_enb_ID_shortmacro_constr_3, memb_enb_ID_shortmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-shortmacro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_longmacro), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_longmacro_constr_4, &asn_PER_memb_enb_ID_longmacro_constr_4, memb_enb_ID_longmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-longmacro" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* enb-ID-macro */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* enb-ID-shortmacro */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* enb-ID-longmacro */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1 = { + sizeof(struct ENB_ID_Choice), + offsetof(struct ENB_ID_Choice, _asn_ctx), + offsetof(struct ENB_ID_Choice, present), + sizeof(((struct ENB_ID_Choice *)0)->present), + asn_MAP_ENB_ID_Choice_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice = { + "ENB-ID-Choice", + "ENB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_Choice_constr_1, &asn_PER_type_ENB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_Choice_1, + 3, /* Elements count */ + &asn_SPC_ENB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/ENB-ID-Choice.h b/src/codec_utils/E2SMKPM/ENB-ID-Choice.h new file mode 100644 index 000000000..f4192dd9e --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENB-ID-Choice.h @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_Choice_H_ +#define _ENB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_Choice_PR { + ENB_ID_Choice_PR_NOTHING, /* No components present */ + ENB_ID_Choice_PR_enb_ID_macro, + ENB_ID_Choice_PR_enb_ID_shortmacro, + ENB_ID_Choice_PR_enb_ID_longmacro + /* Extensions may appear below */ + +} ENB_ID_Choice_PR; + +/* ENB-ID-Choice */ +typedef struct ENB_ID_Choice { + ENB_ID_Choice_PR present; + union ENB_ID_Choice_u { + BIT_STRING_t enb_ID_macro; + BIT_STRING_t enb_ID_shortmacro; + BIT_STRING_t enb_ID_longmacro; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[3]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/ENB-ID.c b/src/codec_utils/E2SMKPM/ENB-ID.c new file mode 100644 index 000000000..76d8ca4f4 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENB-ID.c @@ -0,0 +1,241 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID.h" + +static int +memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 28)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 28 /* (SIZE(28..28)) */}; +static asn_per_constraints_t asn_PER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 28, 28 } /* (SIZE(28..28)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_macro_eNB_ID_constr_2, &asn_PER_memb_macro_eNB_ID_constr_2, memb_macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.home_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_home_eNB_ID_constr_3, &asn_PER_memb_home_eNB_ID_constr_3, memb_home_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "home-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.short_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_short_Macro_eNB_ID_constr_5, &asn_PER_memb_short_Macro_eNB_ID_constr_5, memb_short_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "short-Macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.long_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_long_Macro_eNB_ID_constr_6, &asn_PER_memb_long_Macro_eNB_ID_constr_6, memb_long_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "long-Macro-eNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1 = { + sizeof(struct ENB_ID), + offsetof(struct ENB_ID, _asn_ctx), + offsetof(struct ENB_ID, present), + sizeof(((struct ENB_ID *)0)->present), + asn_MAP_ENB_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID = { + "ENB-ID", + "ENB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_constr_1, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_1, + 4, /* Elements count */ + &asn_SPC_ENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/ENB-ID.h b/src/codec_utils/E2SMKPM/ENB-ID.h new file mode 100644 index 000000000..8003c943e --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENB-ID.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_H_ +#define _ENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_PR { + ENB_ID_PR_NOTHING, /* No components present */ + ENB_ID_PR_macro_eNB_ID, + ENB_ID_PR_home_eNB_ID, + /* Extensions may appear below */ + ENB_ID_PR_short_Macro_eNB_ID, + ENB_ID_PR_long_Macro_eNB_ID +} ENB_ID_PR; + +/* ENB-ID */ +typedef struct ENB_ID { + ENB_ID_PR present; + union ENB_ID_u { + BIT_STRING_t macro_eNB_ID; + BIT_STRING_t home_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + BIT_STRING_t short_Macro_eNB_ID; + BIT_STRING_t long_Macro_eNB_ID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/ENGNB-ID.c b/src/codec_utils/E2SMKPM/ENGNB-ID.c new file mode 100644 index 000000000..4ce44b45c --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENGNB-ID.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENGNB-ID.h" + +static int +memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENGNB_ID, choice.gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gNB_ID_constr_2, &asn_PER_memb_gNB_ID_constr_2, memb_gNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1 = { + sizeof(struct ENGNB_ID), + offsetof(struct ENGNB_ID, _asn_ctx), + offsetof(struct ENGNB_ID, present), + sizeof(((struct ENGNB_ID *)0)->present), + asn_MAP_ENGNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENGNB_ID = { + "ENGNB-ID", + "ENGNB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENGNB_ID_constr_1, &asn_PER_type_ENGNB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENGNB_ID_1, + 1, /* Elements count */ + &asn_SPC_ENGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/ENGNB-ID.h b/src/codec_utils/E2SMKPM/ENGNB-ID.h new file mode 100644 index 000000000..bd3224325 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ENGNB-ID.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENGNB_ID_H_ +#define _ENGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENGNB_ID_PR { + ENGNB_ID_PR_NOTHING, /* No components present */ + ENGNB_ID_PR_gNB_ID + /* Extensions may appear below */ + +} ENGNB_ID_PR; + +/* ENGNB-ID */ +typedef struct ENGNB_ID { + ENGNB_ID_PR present; + union ENGNB_ID_u { + BIT_STRING_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENGNB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENGNB_ID_1[1]; +extern asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.c b/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.c new file mode 100644 index 000000000..66a757ac8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "EPC-CUUP-PM-Format.h" + +#include "PerQCIReportListItemFormat.h" +static int +memb_perQCIReportList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 256)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_perQCIReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +static asn_per_constraints_t asn_PER_type_perQCIReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_perQCIReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +static asn_per_constraints_t asn_PER_memb_perQCIReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_perQCIReportList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_PerQCIReportListItemFormat, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_perQCIReportList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_perQCIReportList_specs_2 = { + sizeof(struct EPC_CUUP_PM_Format__perQCIReportList), + offsetof(struct EPC_CUUP_PM_Format__perQCIReportList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_perQCIReportList_2 = { + "perQCIReportList", + "perQCIReportList", + &asn_OP_SEQUENCE_OF, + asn_DEF_perQCIReportList_tags_2, + sizeof(asn_DEF_perQCIReportList_tags_2) + /sizeof(asn_DEF_perQCIReportList_tags_2[0]) - 1, /* 1 */ + asn_DEF_perQCIReportList_tags_2, /* Same as above */ + sizeof(asn_DEF_perQCIReportList_tags_2) + /sizeof(asn_DEF_perQCIReportList_tags_2[0]), /* 2 */ + { &asn_OER_type_perQCIReportList_constr_2, &asn_PER_type_perQCIReportList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_perQCIReportList_2, + 1, /* Single element */ + &asn_SPC_perQCIReportList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_EPC_CUUP_PM_Format_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct EPC_CUUP_PM_Format, perQCIReportList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_perQCIReportList_2, + 0, + { &asn_OER_memb_perQCIReportList_constr_2, &asn_PER_memb_perQCIReportList_constr_2, memb_perQCIReportList_constraint_1 }, + 0, 0, /* No default value */ + "perQCIReportList" + }, +}; +static const ber_tlv_tag_t asn_DEF_EPC_CUUP_PM_Format_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EPC_CUUP_PM_Format_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* perQCIReportList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_EPC_CUUP_PM_Format_specs_1 = { + sizeof(struct EPC_CUUP_PM_Format), + offsetof(struct EPC_CUUP_PM_Format, _asn_ctx), + asn_MAP_EPC_CUUP_PM_Format_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_EPC_CUUP_PM_Format = { + "EPC-CUUP-PM-Format", + "EPC-CUUP-PM-Format", + &asn_OP_SEQUENCE, + asn_DEF_EPC_CUUP_PM_Format_tags_1, + sizeof(asn_DEF_EPC_CUUP_PM_Format_tags_1) + /sizeof(asn_DEF_EPC_CUUP_PM_Format_tags_1[0]), /* 1 */ + asn_DEF_EPC_CUUP_PM_Format_tags_1, /* Same as above */ + sizeof(asn_DEF_EPC_CUUP_PM_Format_tags_1) + /sizeof(asn_DEF_EPC_CUUP_PM_Format_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_EPC_CUUP_PM_Format_1, + 1, /* Elements count */ + &asn_SPC_EPC_CUUP_PM_Format_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.h b/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.h new file mode 100644 index 000000000..3ffe46055 --- /dev/null +++ b/src/codec_utils/E2SMKPM/EPC-CUUP-PM-Format.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _EPC_CUUP_PM_Format_H_ +#define _EPC_CUUP_PM_Format_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PerQCIReportListItemFormat; + +/* EPC-CUUP-PM-Format */ +typedef struct EPC_CUUP_PM_Format { + struct EPC_CUUP_PM_Format__perQCIReportList { + A_SEQUENCE_OF(struct PerQCIReportListItemFormat) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } perQCIReportList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EPC_CUUP_PM_Format_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EPC_CUUP_PM_Format; +extern asn_SEQUENCE_specifics_t asn_SPC_EPC_CUUP_PM_Format_specs_1; +extern asn_TYPE_member_t asn_MBR_EPC_CUUP_PM_Format_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _EPC_CUUP_PM_Format_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.c b/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.c new file mode 100644 index 000000000..527f72b4b --- /dev/null +++ b/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "EPC-DU-PM-Container.h" + +#include "PerQCIReportListItem.h" +static int +memb_perQCIReportList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 256)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_perQCIReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +static asn_per_constraints_t asn_PER_type_perQCIReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_perQCIReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +static asn_per_constraints_t asn_PER_memb_perQCIReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_perQCIReportList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_PerQCIReportListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_perQCIReportList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_perQCIReportList_specs_2 = { + sizeof(struct EPC_DU_PM_Container__perQCIReportList), + offsetof(struct EPC_DU_PM_Container__perQCIReportList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_perQCIReportList_2 = { + "perQCIReportList", + "perQCIReportList", + &asn_OP_SEQUENCE_OF, + asn_DEF_perQCIReportList_tags_2, + sizeof(asn_DEF_perQCIReportList_tags_2) + /sizeof(asn_DEF_perQCIReportList_tags_2[0]) - 1, /* 1 */ + asn_DEF_perQCIReportList_tags_2, /* Same as above */ + sizeof(asn_DEF_perQCIReportList_tags_2) + /sizeof(asn_DEF_perQCIReportList_tags_2[0]), /* 2 */ + { &asn_OER_type_perQCIReportList_constr_2, &asn_PER_type_perQCIReportList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_perQCIReportList_2, + 1, /* Single element */ + &asn_SPC_perQCIReportList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_EPC_DU_PM_Container_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct EPC_DU_PM_Container, perQCIReportList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_perQCIReportList_2, + 0, + { &asn_OER_memb_perQCIReportList_constr_2, &asn_PER_memb_perQCIReportList_constr_2, memb_perQCIReportList_constraint_1 }, + 0, 0, /* No default value */ + "perQCIReportList" + }, +}; +static const ber_tlv_tag_t asn_DEF_EPC_DU_PM_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EPC_DU_PM_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* perQCIReportList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_EPC_DU_PM_Container_specs_1 = { + sizeof(struct EPC_DU_PM_Container), + offsetof(struct EPC_DU_PM_Container, _asn_ctx), + asn_MAP_EPC_DU_PM_Container_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_EPC_DU_PM_Container = { + "EPC-DU-PM-Container", + "EPC-DU-PM-Container", + &asn_OP_SEQUENCE, + asn_DEF_EPC_DU_PM_Container_tags_1, + sizeof(asn_DEF_EPC_DU_PM_Container_tags_1) + /sizeof(asn_DEF_EPC_DU_PM_Container_tags_1[0]), /* 1 */ + asn_DEF_EPC_DU_PM_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_EPC_DU_PM_Container_tags_1) + /sizeof(asn_DEF_EPC_DU_PM_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_EPC_DU_PM_Container_1, + 1, /* Elements count */ + &asn_SPC_EPC_DU_PM_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.h b/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.h new file mode 100644 index 000000000..ca30e5163 --- /dev/null +++ b/src/codec_utils/E2SMKPM/EPC-DU-PM-Container.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _EPC_DU_PM_Container_H_ +#define _EPC_DU_PM_Container_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PerQCIReportListItem; + +/* EPC-DU-PM-Container */ +typedef struct EPC_DU_PM_Container { + struct EPC_DU_PM_Container__perQCIReportList { + A_SEQUENCE_OF(struct PerQCIReportListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } perQCIReportList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EPC_DU_PM_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EPC_DU_PM_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_EPC_DU_PM_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_EPC_DU_PM_Container_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _EPC_DU_PM_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.c b/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.c new file mode 100644 index 000000000..8fa40a797 --- /dev/null +++ b/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "FGC-CUUP-PM-Format.h" + +#include "SliceToReportListItem.h" +static int +memb_sliceToReportList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 1024)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_sliceToReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +static asn_per_constraints_t asn_PER_type_sliceToReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_sliceToReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +static asn_per_constraints_t asn_PER_memb_sliceToReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_sliceToReportList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_SliceToReportListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_sliceToReportList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_sliceToReportList_specs_2 = { + sizeof(struct FGC_CUUP_PM_Format__sliceToReportList), + offsetof(struct FGC_CUUP_PM_Format__sliceToReportList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_sliceToReportList_2 = { + "sliceToReportList", + "sliceToReportList", + &asn_OP_SEQUENCE_OF, + asn_DEF_sliceToReportList_tags_2, + sizeof(asn_DEF_sliceToReportList_tags_2) + /sizeof(asn_DEF_sliceToReportList_tags_2[0]) - 1, /* 1 */ + asn_DEF_sliceToReportList_tags_2, /* Same as above */ + sizeof(asn_DEF_sliceToReportList_tags_2) + /sizeof(asn_DEF_sliceToReportList_tags_2[0]), /* 2 */ + { &asn_OER_type_sliceToReportList_constr_2, &asn_PER_type_sliceToReportList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_sliceToReportList_2, + 1, /* Single element */ + &asn_SPC_sliceToReportList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_FGC_CUUP_PM_Format_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct FGC_CUUP_PM_Format, sliceToReportList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_sliceToReportList_2, + 0, + { &asn_OER_memb_sliceToReportList_constr_2, &asn_PER_memb_sliceToReportList_constr_2, memb_sliceToReportList_constraint_1 }, + 0, 0, /* No default value */ + "sliceToReportList" + }, +}; +static const ber_tlv_tag_t asn_DEF_FGC_CUUP_PM_Format_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_FGC_CUUP_PM_Format_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sliceToReportList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_FGC_CUUP_PM_Format_specs_1 = { + sizeof(struct FGC_CUUP_PM_Format), + offsetof(struct FGC_CUUP_PM_Format, _asn_ctx), + asn_MAP_FGC_CUUP_PM_Format_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_FGC_CUUP_PM_Format = { + "FGC-CUUP-PM-Format", + "FGC-CUUP-PM-Format", + &asn_OP_SEQUENCE, + asn_DEF_FGC_CUUP_PM_Format_tags_1, + sizeof(asn_DEF_FGC_CUUP_PM_Format_tags_1) + /sizeof(asn_DEF_FGC_CUUP_PM_Format_tags_1[0]), /* 1 */ + asn_DEF_FGC_CUUP_PM_Format_tags_1, /* Same as above */ + sizeof(asn_DEF_FGC_CUUP_PM_Format_tags_1) + /sizeof(asn_DEF_FGC_CUUP_PM_Format_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_FGC_CUUP_PM_Format_1, + 1, /* Elements count */ + &asn_SPC_FGC_CUUP_PM_Format_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.h b/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.h new file mode 100644 index 000000000..324c141ef --- /dev/null +++ b/src/codec_utils/E2SMKPM/FGC-CUUP-PM-Format.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _FGC_CUUP_PM_Format_H_ +#define _FGC_CUUP_PM_Format_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct SliceToReportListItem; + +/* FGC-CUUP-PM-Format */ +typedef struct FGC_CUUP_PM_Format { + struct FGC_CUUP_PM_Format__sliceToReportList { + A_SEQUENCE_OF(struct SliceToReportListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } sliceToReportList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} FGC_CUUP_PM_Format_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_FGC_CUUP_PM_Format; +extern asn_SEQUENCE_specifics_t asn_SPC_FGC_CUUP_PM_Format_specs_1; +extern asn_TYPE_member_t asn_MBR_FGC_CUUP_PM_Format_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _FGC_CUUP_PM_Format_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.c b/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.c new file mode 100644 index 000000000..66b360e0d --- /dev/null +++ b/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "FGC-DU-PM-Container.h" + +#include "SlicePerPlmnPerCellListItem.h" +static int +memb_slicePerPlmnPerCellList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 1024)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_slicePerPlmnPerCellList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +static asn_per_constraints_t asn_PER_type_slicePerPlmnPerCellList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_slicePerPlmnPerCellList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..1024)) */}; +static asn_per_constraints_t asn_PER_memb_slicePerPlmnPerCellList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 10, 10, 1, 1024 } /* (SIZE(1..1024)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_slicePerPlmnPerCellList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_SlicePerPlmnPerCellListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_slicePerPlmnPerCellList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_slicePerPlmnPerCellList_specs_2 = { + sizeof(struct FGC_DU_PM_Container__slicePerPlmnPerCellList), + offsetof(struct FGC_DU_PM_Container__slicePerPlmnPerCellList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_slicePerPlmnPerCellList_2 = { + "slicePerPlmnPerCellList", + "slicePerPlmnPerCellList", + &asn_OP_SEQUENCE_OF, + asn_DEF_slicePerPlmnPerCellList_tags_2, + sizeof(asn_DEF_slicePerPlmnPerCellList_tags_2) + /sizeof(asn_DEF_slicePerPlmnPerCellList_tags_2[0]) - 1, /* 1 */ + asn_DEF_slicePerPlmnPerCellList_tags_2, /* Same as above */ + sizeof(asn_DEF_slicePerPlmnPerCellList_tags_2) + /sizeof(asn_DEF_slicePerPlmnPerCellList_tags_2[0]), /* 2 */ + { &asn_OER_type_slicePerPlmnPerCellList_constr_2, &asn_PER_type_slicePerPlmnPerCellList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_slicePerPlmnPerCellList_2, + 1, /* Single element */ + &asn_SPC_slicePerPlmnPerCellList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_FGC_DU_PM_Container_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct FGC_DU_PM_Container, slicePerPlmnPerCellList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_slicePerPlmnPerCellList_2, + 0, + { &asn_OER_memb_slicePerPlmnPerCellList_constr_2, &asn_PER_memb_slicePerPlmnPerCellList_constr_2, memb_slicePerPlmnPerCellList_constraint_1 }, + 0, 0, /* No default value */ + "slicePerPlmnPerCellList" + }, +}; +static const ber_tlv_tag_t asn_DEF_FGC_DU_PM_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_FGC_DU_PM_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* slicePerPlmnPerCellList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_FGC_DU_PM_Container_specs_1 = { + sizeof(struct FGC_DU_PM_Container), + offsetof(struct FGC_DU_PM_Container, _asn_ctx), + asn_MAP_FGC_DU_PM_Container_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_FGC_DU_PM_Container = { + "FGC-DU-PM-Container", + "FGC-DU-PM-Container", + &asn_OP_SEQUENCE, + asn_DEF_FGC_DU_PM_Container_tags_1, + sizeof(asn_DEF_FGC_DU_PM_Container_tags_1) + /sizeof(asn_DEF_FGC_DU_PM_Container_tags_1[0]), /* 1 */ + asn_DEF_FGC_DU_PM_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_FGC_DU_PM_Container_tags_1) + /sizeof(asn_DEF_FGC_DU_PM_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_FGC_DU_PM_Container_1, + 1, /* Elements count */ + &asn_SPC_FGC_DU_PM_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.h b/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.h new file mode 100644 index 000000000..7b647a058 --- /dev/null +++ b/src/codec_utils/E2SMKPM/FGC-DU-PM-Container.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _FGC_DU_PM_Container_H_ +#define _FGC_DU_PM_Container_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct SlicePerPlmnPerCellListItem; + +/* FGC-DU-PM-Container */ +typedef struct FGC_DU_PM_Container { + struct FGC_DU_PM_Container__slicePerPlmnPerCellList { + A_SEQUENCE_OF(struct SlicePerPlmnPerCellListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } slicePerPlmnPerCellList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} FGC_DU_PM_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_FGC_DU_PM_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_FGC_DU_PM_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_FGC_DU_PM_Container_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _FGC_DU_PM_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.c b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.c new file mode 100644 index 000000000..1d91b5eed --- /dev/null +++ b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.c @@ -0,0 +1,183 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "FQIPERSlicesPerPlmnListItem.h" + +static int +memb_fiveQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_pDCPBytesDL_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 10000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_pDCPBytesUL_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 10000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_fiveQI_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_fiveQI_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pDCPBytesDL_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_pDCPBytesDL_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 34, -1, 0, 10000000000 } /* (0..10000000000,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pDCPBytesUL_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_pDCPBytesUL_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 34, -1, 0, 10000000000 } /* (0..10000000000,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_FQIPERSlicesPerPlmnListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct FQIPERSlicesPerPlmnListItem, fiveQI), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_fiveQI_constr_2, &asn_PER_memb_fiveQI_constr_2, memb_fiveQI_constraint_1 }, + 0, 0, /* No default value */ + "fiveQI" + }, + { ATF_POINTER, 2, offsetof(struct FQIPERSlicesPerPlmnListItem, pDCPBytesDL), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_INTEGER, + 0, + { &asn_OER_memb_pDCPBytesDL_constr_3, &asn_PER_memb_pDCPBytesDL_constr_3, memb_pDCPBytesDL_constraint_1 }, + 0, 0, /* No default value */ + "pDCPBytesDL" + }, + { ATF_POINTER, 1, offsetof(struct FQIPERSlicesPerPlmnListItem, pDCPBytesUL), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_INTEGER, + 0, + { &asn_OER_memb_pDCPBytesUL_constr_4, &asn_PER_memb_pDCPBytesUL_constr_4, memb_pDCPBytesUL_constraint_1 }, + 0, 0, /* No default value */ + "pDCPBytesUL" + }, +}; +static const int asn_MAP_FQIPERSlicesPerPlmnListItem_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_FQIPERSlicesPerPlmnListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fiveQI */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pDCPBytesDL */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* pDCPBytesUL */ +}; +asn_SEQUENCE_specifics_t asn_SPC_FQIPERSlicesPerPlmnListItem_specs_1 = { + sizeof(struct FQIPERSlicesPerPlmnListItem), + offsetof(struct FQIPERSlicesPerPlmnListItem, _asn_ctx), + asn_MAP_FQIPERSlicesPerPlmnListItem_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_FQIPERSlicesPerPlmnListItem_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_FQIPERSlicesPerPlmnListItem = { + "FQIPERSlicesPerPlmnListItem", + "FQIPERSlicesPerPlmnListItem", + &asn_OP_SEQUENCE, + asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1, + sizeof(asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1) + /sizeof(asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1[0]), /* 1 */ + asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1) + /sizeof(asn_DEF_FQIPERSlicesPerPlmnListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_FQIPERSlicesPerPlmnListItem_1, + 3, /* Elements count */ + &asn_SPC_FQIPERSlicesPerPlmnListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.h b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.h new file mode 100644 index 000000000..6404acc23 --- /dev/null +++ b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnListItem.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _FQIPERSlicesPerPlmnListItem_H_ +#define _FQIPERSlicesPerPlmnListItem_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* FQIPERSlicesPerPlmnListItem */ +typedef struct FQIPERSlicesPerPlmnListItem { + long fiveQI; + INTEGER_t *pDCPBytesDL; /* OPTIONAL */ + INTEGER_t *pDCPBytesUL; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} FQIPERSlicesPerPlmnListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_FQIPERSlicesPerPlmnListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_FQIPERSlicesPerPlmnListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_FQIPERSlicesPerPlmnListItem_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _FQIPERSlicesPerPlmnListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.c b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.c new file mode 100644 index 000000000..7f6aef66b --- /dev/null +++ b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.c @@ -0,0 +1,171 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "FQIPERSlicesPerPlmnPerCellListItem.h" + +static int +memb_fiveQI_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_dl_PRBUsage_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 273)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ul_PRBUsage_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 273)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_fiveQI_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_fiveQI_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_dl_PRBUsage_constr_3 CC_NOTUSED = { + { 2, 1 } /* (0..273) */, + -1}; +static asn_per_constraints_t asn_PER_memb_dl_PRBUsage_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 9, 9, 0, 273 } /* (0..273) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ul_PRBUsage_constr_4 CC_NOTUSED = { + { 2, 1 } /* (0..273) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ul_PRBUsage_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED, 9, 9, 0, 273 } /* (0..273) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_FQIPERSlicesPerPlmnPerCellListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct FQIPERSlicesPerPlmnPerCellListItem, fiveQI), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_fiveQI_constr_2, &asn_PER_memb_fiveQI_constr_2, memb_fiveQI_constraint_1 }, + 0, 0, /* No default value */ + "fiveQI" + }, + { ATF_POINTER, 2, offsetof(struct FQIPERSlicesPerPlmnPerCellListItem, dl_PRBUsage), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_dl_PRBUsage_constr_3, &asn_PER_memb_dl_PRBUsage_constr_3, memb_dl_PRBUsage_constraint_1 }, + 0, 0, /* No default value */ + "dl-PRBUsage" + }, + { ATF_POINTER, 1, offsetof(struct FQIPERSlicesPerPlmnPerCellListItem, ul_PRBUsage), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ul_PRBUsage_constr_4, &asn_PER_memb_ul_PRBUsage_constr_4, memb_ul_PRBUsage_constraint_1 }, + 0, 0, /* No default value */ + "ul-PRBUsage" + }, +}; +static const int asn_MAP_FQIPERSlicesPerPlmnPerCellListItem_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_FQIPERSlicesPerPlmnPerCellListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fiveQI */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dl-PRBUsage */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ul-PRBUsage */ +}; +asn_SEQUENCE_specifics_t asn_SPC_FQIPERSlicesPerPlmnPerCellListItem_specs_1 = { + sizeof(struct FQIPERSlicesPerPlmnPerCellListItem), + offsetof(struct FQIPERSlicesPerPlmnPerCellListItem, _asn_ctx), + asn_MAP_FQIPERSlicesPerPlmnPerCellListItem_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_FQIPERSlicesPerPlmnPerCellListItem_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_FQIPERSlicesPerPlmnPerCellListItem = { + "FQIPERSlicesPerPlmnPerCellListItem", + "FQIPERSlicesPerPlmnPerCellListItem", + &asn_OP_SEQUENCE, + asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1, + sizeof(asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1[0]), /* 1 */ + asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_FQIPERSlicesPerPlmnPerCellListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_FQIPERSlicesPerPlmnPerCellListItem_1, + 3, /* Elements count */ + &asn_SPC_FQIPERSlicesPerPlmnPerCellListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.h b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.h new file mode 100644 index 000000000..2182665eb --- /dev/null +++ b/src/codec_utils/E2SMKPM/FQIPERSlicesPerPlmnPerCellListItem.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _FQIPERSlicesPerPlmnPerCellListItem_H_ +#define _FQIPERSlicesPerPlmnPerCellListItem_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* FQIPERSlicesPerPlmnPerCellListItem */ +typedef struct FQIPERSlicesPerPlmnPerCellListItem { + long fiveQI; + long *dl_PRBUsage; /* OPTIONAL */ + long *ul_PRBUsage; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} FQIPERSlicesPerPlmnPerCellListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_FQIPERSlicesPerPlmnPerCellListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_FQIPERSlicesPerPlmnPerCellListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_FQIPERSlicesPerPlmnPerCellListItem_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _FQIPERSlicesPerPlmnPerCellListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.c b/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.c new file mode 100644 index 000000000..fafd8d5df --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.c @@ -0,0 +1,109 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-CU-CP-Name.h" + +static const int permitted_alphabet_table_1[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_1[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_1(const void *sptr) { + const int *table = permitted_alphabet_table_1; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +int +GNB_CU_CP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_GNB_CU_CP_Name_1_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) + return -1; + return permitted_alphabet_table_1[value] - 1; +} +static int asn_PER_MAP_GNB_CU_CP_Name_1_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) + return -1; + return permitted_alphabet_code2value_1[code]; +} +/* + * This type is implemented using PrintableString, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_CU_CP_Name_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +asn_per_constraints_t asn_PER_type_GNB_CU_CP_Name_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_GNB_CU_CP_Name_1_v2c, /* Value to PER code map */ + asn_PER_MAP_GNB_CU_CP_Name_1_c2v /* PER code to value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_CU_CP_Name_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_CU_CP_Name = { + "GNB-CU-CP-Name", + "GNB-CU-CP-Name", + &asn_OP_PrintableString, + asn_DEF_GNB_CU_CP_Name_tags_1, + sizeof(asn_DEF_GNB_CU_CP_Name_tags_1) + /sizeof(asn_DEF_GNB_CU_CP_Name_tags_1[0]), /* 1 */ + asn_DEF_GNB_CU_CP_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_CU_CP_Name_tags_1) + /sizeof(asn_DEF_GNB_CU_CP_Name_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_CU_CP_Name_constr_1, &asn_PER_type_GNB_CU_CP_Name_constr_1, GNB_CU_CP_Name_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.h b/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.h new file mode 100644 index 000000000..418ea63bf --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-CP-Name.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_CU_CP_Name_H_ +#define _GNB_CU_CP_Name_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-CU-CP-Name */ +typedef PrintableString_t GNB_CU_CP_Name_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_CU_CP_Name_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_CP_Name; +asn_struct_free_f GNB_CU_CP_Name_free; +asn_struct_print_f GNB_CU_CP_Name_print; +asn_constr_check_f GNB_CU_CP_Name_constraint; +ber_type_decoder_f GNB_CU_CP_Name_decode_ber; +der_type_encoder_f GNB_CU_CP_Name_encode_der; +xer_type_decoder_f GNB_CU_CP_Name_decode_xer; +xer_type_encoder_f GNB_CU_CP_Name_encode_xer; +oer_type_decoder_f GNB_CU_CP_Name_decode_oer; +oer_type_encoder_f GNB_CU_CP_Name_encode_oer; +per_type_decoder_f GNB_CU_CP_Name_decode_uper; +per_type_encoder_f GNB_CU_CP_Name_encode_uper; +per_type_decoder_f GNB_CU_CP_Name_decode_aper; +per_type_encoder_f GNB_CU_CP_Name_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_CU_CP_Name_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.c b/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.c new file mode 100644 index 000000000..cd2581861 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-CU-UP-ID.h" + +int +GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = { + "GNB-CU-UP-ID", + "GNB-CU-UP-ID", + &asn_OP_INTEGER, + asn_DEF_GNB_CU_UP_ID_tags_1, + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + asn_DEF_GNB_CU_UP_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_CU_UP_ID_constr_1, &asn_PER_type_GNB_CU_UP_ID_constr_1, GNB_CU_UP_ID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.h b/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.h new file mode 100644 index 000000000..dca0d4494 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-UP-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_CU_UP_ID_H_ +#define _GNB_CU_UP_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-CU-UP-ID */ +typedef INTEGER_t GNB_CU_UP_ID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID; +asn_struct_free_f GNB_CU_UP_ID_free; +asn_struct_print_f GNB_CU_UP_ID_print; +asn_constr_check_f GNB_CU_UP_ID_constraint; +ber_type_decoder_f GNB_CU_UP_ID_decode_ber; +der_type_encoder_f GNB_CU_UP_ID_encode_der; +xer_type_decoder_f GNB_CU_UP_ID_decode_xer; +xer_type_encoder_f GNB_CU_UP_ID_encode_xer; +oer_type_decoder_f GNB_CU_UP_ID_decode_oer; +oer_type_encoder_f GNB_CU_UP_ID_encode_oer; +per_type_decoder_f GNB_CU_UP_ID_decode_uper; +per_type_encoder_f GNB_CU_UP_ID_encode_uper; +per_type_decoder_f GNB_CU_UP_ID_decode_aper; +per_type_encoder_f GNB_CU_UP_ID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_CU_UP_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.c b/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.c new file mode 100644 index 000000000..a671e5cea --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.c @@ -0,0 +1,109 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-CU-UP-Name.h" + +static const int permitted_alphabet_table_1[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_1[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_1(const void *sptr) { + const int *table = permitted_alphabet_table_1; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +int +GNB_CU_UP_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_GNB_CU_UP_Name_1_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) + return -1; + return permitted_alphabet_table_1[value] - 1; +} +static int asn_PER_MAP_GNB_CU_UP_Name_1_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) + return -1; + return permitted_alphabet_code2value_1[code]; +} +/* + * This type is implemented using PrintableString, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_Name_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +asn_per_constraints_t asn_PER_type_GNB_CU_UP_Name_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_GNB_CU_UP_Name_1_v2c, /* Value to PER code map */ + asn_PER_MAP_GNB_CU_UP_Name_1_c2v /* PER code to value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_Name_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_Name = { + "GNB-CU-UP-Name", + "GNB-CU-UP-Name", + &asn_OP_PrintableString, + asn_DEF_GNB_CU_UP_Name_tags_1, + sizeof(asn_DEF_GNB_CU_UP_Name_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_Name_tags_1[0]), /* 1 */ + asn_DEF_GNB_CU_UP_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_CU_UP_Name_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_Name_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_CU_UP_Name_constr_1, &asn_PER_type_GNB_CU_UP_Name_constr_1, GNB_CU_UP_Name_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.h b/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.h new file mode 100644 index 000000000..4a271167a --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-CU-UP-Name.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_CU_UP_Name_H_ +#define _GNB_CU_UP_Name_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-CU-UP-Name */ +typedef PrintableString_t GNB_CU_UP_Name_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_CU_UP_Name_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_Name; +asn_struct_free_f GNB_CU_UP_Name_free; +asn_struct_print_f GNB_CU_UP_Name_print; +asn_constr_check_f GNB_CU_UP_Name_constraint; +ber_type_decoder_f GNB_CU_UP_Name_decode_ber; +der_type_encoder_f GNB_CU_UP_Name_encode_der; +xer_type_decoder_f GNB_CU_UP_Name_decode_xer; +xer_type_encoder_f GNB_CU_UP_Name_encode_xer; +oer_type_decoder_f GNB_CU_UP_Name_decode_oer; +oer_type_encoder_f GNB_CU_UP_Name_encode_oer; +per_type_decoder_f GNB_CU_UP_Name_decode_uper; +per_type_encoder_f GNB_CU_UP_Name_encode_uper; +per_type_decoder_f GNB_CU_UP_Name_decode_aper; +per_type_encoder_f GNB_CU_UP_Name_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_CU_UP_Name_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-DU-ID.c b/src/codec_utils/E2SMKPM/GNB-DU-ID.c new file mode 100644 index 000000000..3c8011980 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-DU-ID.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-DU-ID.h" + +int +GNB_DU_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_DU_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_DU_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_DU_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID = { + "GNB-DU-ID", + "GNB-DU-ID", + &asn_OP_INTEGER, + asn_DEF_GNB_DU_ID_tags_1, + sizeof(asn_DEF_GNB_DU_ID_tags_1) + /sizeof(asn_DEF_GNB_DU_ID_tags_1[0]), /* 1 */ + asn_DEF_GNB_DU_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_DU_ID_tags_1) + /sizeof(asn_DEF_GNB_DU_ID_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_DU_ID_constr_1, &asn_PER_type_GNB_DU_ID_constr_1, GNB_DU_ID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-DU-ID.h b/src/codec_utils/E2SMKPM/GNB-DU-ID.h new file mode 100644 index 000000000..80cb9470e --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-DU-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_DU_ID_H_ +#define _GNB_DU_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-DU-ID */ +typedef INTEGER_t GNB_DU_ID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_DU_ID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_DU_ID; +asn_struct_free_f GNB_DU_ID_free; +asn_struct_print_f GNB_DU_ID_print; +asn_constr_check_f GNB_DU_ID_constraint; +ber_type_decoder_f GNB_DU_ID_decode_ber; +der_type_encoder_f GNB_DU_ID_encode_der; +xer_type_decoder_f GNB_DU_ID_decode_xer; +xer_type_encoder_f GNB_DU_ID_encode_xer; +oer_type_decoder_f GNB_DU_ID_decode_oer; +oer_type_encoder_f GNB_DU_ID_encode_oer; +per_type_decoder_f GNB_DU_ID_decode_uper; +per_type_encoder_f GNB_DU_ID_encode_uper; +per_type_decoder_f GNB_DU_ID_decode_aper; +per_type_encoder_f GNB_DU_ID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_DU_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-DU-Name.c b/src/codec_utils/E2SMKPM/GNB-DU-Name.c new file mode 100644 index 000000000..5b5c937d6 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-DU-Name.c @@ -0,0 +1,109 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-DU-Name.h" + +static const int permitted_alphabet_table_1[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_1[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_1(const void *sptr) { + const int *table = permitted_alphabet_table_1; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +int +GNB_DU_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_GNB_DU_Name_1_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) + return -1; + return permitted_alphabet_table_1[value] - 1; +} +static int asn_PER_MAP_GNB_DU_Name_1_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) + return -1; + return permitted_alphabet_code2value_1[code]; +} +/* + * This type is implemented using PrintableString, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_DU_Name_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +static asn_per_constraints_t asn_PER_type_GNB_DU_Name_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_GNB_DU_Name_1_v2c, /* Value to PER code map */ + asn_PER_MAP_GNB_DU_Name_1_c2v /* PER code to value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_DU_Name_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_DU_Name = { + "GNB-DU-Name", + "GNB-DU-Name", + &asn_OP_PrintableString, + asn_DEF_GNB_DU_Name_tags_1, + sizeof(asn_DEF_GNB_DU_Name_tags_1) + /sizeof(asn_DEF_GNB_DU_Name_tags_1[0]), /* 1 */ + asn_DEF_GNB_DU_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_DU_Name_tags_1) + /sizeof(asn_DEF_GNB_DU_Name_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_DU_Name_constr_1, &asn_PER_type_GNB_DU_Name_constr_1, GNB_DU_Name_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-DU-Name.h b/src/codec_utils/E2SMKPM/GNB-DU-Name.h new file mode 100644 index 000000000..5d9b05155 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-DU-Name.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_DU_Name_H_ +#define _GNB_DU_Name_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-DU-Name */ +typedef PrintableString_t GNB_DU_Name_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GNB_DU_Name; +asn_struct_free_f GNB_DU_Name_free; +asn_struct_print_f GNB_DU_Name_print; +asn_constr_check_f GNB_DU_Name_constraint; +ber_type_decoder_f GNB_DU_Name_decode_ber; +der_type_encoder_f GNB_DU_Name_encode_der; +xer_type_decoder_f GNB_DU_Name_decode_xer; +xer_type_encoder_f GNB_DU_Name_encode_xer; +oer_type_decoder_f GNB_DU_Name_decode_oer; +oer_type_encoder_f GNB_DU_Name_encode_oer; +per_type_decoder_f GNB_DU_Name_decode_uper; +per_type_encoder_f GNB_DU_Name_encode_uper; +per_type_decoder_f GNB_DU_Name_decode_aper; +per_type_encoder_f GNB_DU_Name_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_DU_Name_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GNB-ID-Choice.c b/src/codec_utils/E2SMKPM/GNB-ID-Choice.c new file mode 100644 index 000000000..ac38a9427 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-ID-Choice.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-ID-Choice.h" + +static int +memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GNB_ID_Choice, choice.gnb_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gnb_ID_constr_2, &asn_PER_memb_gnb_ID_constr_2, memb_gnb_ID_constraint_1 }, + 0, 0, /* No default value */ + "gnb-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GNB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gnb-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1 = { + sizeof(struct GNB_ID_Choice), + offsetof(struct GNB_ID_Choice, _asn_ctx), + offsetof(struct GNB_ID_Choice, present), + sizeof(((struct GNB_ID_Choice *)0)->present), + asn_MAP_GNB_ID_Choice_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice = { + "GNB-ID-Choice", + "GNB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GNB_ID_Choice_constr_1, &asn_PER_type_GNB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_GNB_ID_Choice_1, + 1, /* Elements count */ + &asn_SPC_GNB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GNB-ID-Choice.h b/src/codec_utils/E2SMKPM/GNB-ID-Choice.h new file mode 100644 index 000000000..0284fa246 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GNB-ID-Choice.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_ID_Choice_H_ +#define _GNB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GNB_ID_Choice_PR { + GNB_ID_Choice_PR_NOTHING, /* No components present */ + GNB_ID_Choice_PR_gnb_ID + /* Extensions may appear below */ + +} GNB_ID_Choice_PR; + +/* GNB-ID-Choice */ +typedef struct GNB_ID_Choice { + GNB_ID_Choice_PR present; + union GNB_ID_Choice_u { + BIT_STRING_t gnb_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GNB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[1]; +extern asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalENB-ID.c b/src/codec_utils/E2SMKPM/GlobalENB-ID.c new file mode 100644 index 000000000..bfd3fe6f1 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalENB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalENB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1 = { + sizeof(struct GlobalENB_ID), + offsetof(struct GlobalENB_ID, _asn_ctx), + asn_MAP_GlobalENB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = { + "GlobalENB-ID", + "GlobalENB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalENB_ID_tags_1, + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalENB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalENB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalENB-ID.h b/src/codec_utils/E2SMKPM/GlobalENB-ID.h new file mode 100644 index 000000000..51e3eb51d --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalENB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalENB_ID_H_ +#define _GlobalENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include "ENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalENB-ID */ +typedef struct GlobalENB_ID { + PLMN_Identity_t pLMN_Identity; + ENB_ID_t eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.c b/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.c new file mode 100644 index 000000000..b505d2e98 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.c @@ -0,0 +1,89 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalKPMnode-ID.h" + +#include "GlobalKPMnode-gNB-ID.h" +#include "GlobalKPMnode-en-gNB-ID.h" +#include "GlobalKPMnode-ng-eNB-ID.h" +#include "GlobalKPMnode-eNB-ID.h" +static asn_oer_constraints_t asn_OER_type_GlobalKPMnode_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_GlobalKPMnode_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_GlobalKPMnode_ID_1[] = { + { ATF_POINTER, 0, offsetof(struct GlobalKPMnode_ID, choice.gNB), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalKPMnode_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalKPMnode_ID, choice.en_gNB), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalKPMnode_en_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "en-gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalKPMnode_ID, choice.ng_eNB), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalKPMnode_ng_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ng-eNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalKPMnode_ID, choice.eNB), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalKPMnode_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalKPMnode_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* eNB */ +}; +asn_CHOICE_specifics_t asn_SPC_GlobalKPMnode_ID_specs_1 = { + sizeof(struct GlobalKPMnode_ID), + offsetof(struct GlobalKPMnode_ID, _asn_ctx), + offsetof(struct GlobalKPMnode_ID, present), + sizeof(((struct GlobalKPMnode_ID *)0)->present), + asn_MAP_GlobalKPMnode_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 4 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_ID = { + "GlobalKPMnode-ID", + "GlobalKPMnode-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GlobalKPMnode_ID_constr_1, &asn_PER_type_GlobalKPMnode_ID_constr_1, CHOICE_constraint }, + asn_MBR_GlobalKPMnode_ID_1, + 4, /* Elements count */ + &asn_SPC_GlobalKPMnode_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.h b/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.h new file mode 100644 index 000000000..89c8a40a2 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-ID.h @@ -0,0 +1,67 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalKPMnode_ID_H_ +#define _GlobalKPMnode_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GlobalKPMnode_ID_PR { + GlobalKPMnode_ID_PR_NOTHING, /* No components present */ + GlobalKPMnode_ID_PR_gNB, + GlobalKPMnode_ID_PR_en_gNB, + GlobalKPMnode_ID_PR_ng_eNB, + GlobalKPMnode_ID_PR_eNB + /* Extensions may appear below */ + +} GlobalKPMnode_ID_PR; + +/* Forward declarations */ +struct GlobalKPMnode_gNB_ID; +struct GlobalKPMnode_en_gNB_ID; +struct GlobalKPMnode_ng_eNB_ID; +struct GlobalKPMnode_eNB_ID; + +/* GlobalKPMnode-ID */ +typedef struct GlobalKPMnode_ID { + GlobalKPMnode_ID_PR present; + union GlobalKPMnode_ID_u { + struct GlobalKPMnode_gNB_ID *gNB; + struct GlobalKPMnode_en_gNB_ID *en_gNB; + struct GlobalKPMnode_ng_eNB_ID *ng_eNB; + struct GlobalKPMnode_eNB_ID *eNB; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalKPMnode_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_ID; +extern asn_CHOICE_specifics_t asn_SPC_GlobalKPMnode_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalKPMnode_ID_1[4]; +extern asn_per_constraints_t asn_PER_type_GlobalKPMnode_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalKPMnode_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.c b/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.c new file mode 100644 index 000000000..19ed8eddb --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalKPMnode-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalKPMnode_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalKPMnode_eNB_ID, global_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalKPMnode_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalKPMnode_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_eNB_ID_specs_1 = { + sizeof(struct GlobalKPMnode_eNB_ID), + offsetof(struct GlobalKPMnode_eNB_ID, _asn_ctx), + asn_MAP_GlobalKPMnode_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_eNB_ID = { + "GlobalKPMnode-eNB-ID", + "GlobalKPMnode-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalKPMnode_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalKPMnode_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalKPMnode_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalKPMnode_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalKPMnode_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalKPMnode_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.h b/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.h new file mode 100644 index 000000000..73d93c834 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalKPMnode_eNB_ID_H_ +#define _GlobalKPMnode_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalKPMnode-eNB-ID */ +typedef struct GlobalKPMnode_eNB_ID { + GlobalENB_ID_t global_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalKPMnode_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalKPMnode_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalKPMnode_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.c b/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.c new file mode 100644 index 000000000..3fddf3a53 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalKPMnode-en-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalKPMnode_en_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalKPMnode_en_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalenGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalKPMnode_en_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_en_gNB_ID_specs_1 = { + sizeof(struct GlobalKPMnode_en_gNB_ID), + offsetof(struct GlobalKPMnode_en_gNB_ID, _asn_ctx), + asn_MAP_GlobalKPMnode_en_gNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_en_gNB_ID = { + "GlobalKPMnode-en-gNB-ID", + "GlobalKPMnode-en-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_en_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalKPMnode_en_gNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalKPMnode_en_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.h b/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.h new file mode 100644 index 000000000..120df5a3f --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-en-gNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalKPMnode_en_gNB_ID_H_ +#define _GlobalKPMnode_en_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalenGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalKPMnode-en-gNB-ID */ +typedef struct GlobalKPMnode_en_gNB_ID { + GlobalenGNB_ID_t global_gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalKPMnode_en_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_en_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_en_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalKPMnode_en_gNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalKPMnode_en_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.c b/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.c new file mode 100644 index 000000000..e38698b08 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.c @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalKPMnode-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalKPMnode_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalKPMnode_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalgNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, + { ATF_POINTER, 2, offsetof(struct GlobalKPMnode_gNB_ID, gNB_CU_UP_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-CU-UP-ID" + }, + { ATF_POINTER, 1, offsetof(struct GlobalKPMnode_gNB_ID, gNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_DU_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-DU-ID" + }, +}; +static const int asn_MAP_GlobalKPMnode_gNB_ID_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_GlobalKPMnode_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalKPMnode_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-gNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-CU-UP-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gNB-DU-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_gNB_ID_specs_1 = { + sizeof(struct GlobalKPMnode_gNB_ID), + offsetof(struct GlobalKPMnode_gNB_ID, _asn_ctx), + asn_MAP_GlobalKPMnode_gNB_ID_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_GlobalKPMnode_gNB_ID_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_gNB_ID = { + "GlobalKPMnode-gNB-ID", + "GlobalKPMnode-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalKPMnode_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalKPMnode_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalKPMnode_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalKPMnode_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalKPMnode_gNB_ID_1, + 3, /* Elements count */ + &asn_SPC_GlobalKPMnode_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.h b/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.h new file mode 100644 index 000000000..bfcb48e54 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-gNB-ID.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalKPMnode_gNB_ID_H_ +#define _GlobalKPMnode_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalgNB-ID.h" +#include "GNB-CU-UP-ID.h" +#include "GNB-DU-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalKPMnode-gNB-ID */ +typedef struct GlobalKPMnode_gNB_ID { + GlobalgNB_ID_t global_gNB_ID; + GNB_CU_UP_ID_t *gNB_CU_UP_ID; /* OPTIONAL */ + GNB_DU_ID_t *gNB_DU_ID; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalKPMnode_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalKPMnode_gNB_ID_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalKPMnode_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.c b/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.c new file mode 100644 index 000000000..b24c9a896 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalKPMnode-ng-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalKPMnode_ng_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalKPMnode_ng_eNB_ID, global_ng_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalngeNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-ng-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalKPMnode_ng_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-ng-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_ng_eNB_ID_specs_1 = { + sizeof(struct GlobalKPMnode_ng_eNB_ID), + offsetof(struct GlobalKPMnode_ng_eNB_ID, _asn_ctx), + asn_MAP_GlobalKPMnode_ng_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_ng_eNB_ID = { + "GlobalKPMnode-ng-eNB-ID", + "GlobalKPMnode-ng-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalKPMnode_ng_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalKPMnode_ng_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalKPMnode_ng_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.h b/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.h new file mode 100644 index 000000000..e619f5171 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalKPMnode-ng-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalKPMnode_ng_eNB_ID_H_ +#define _GlobalKPMnode_ng_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalngeNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalKPMnode-ng-eNB-ID */ +typedef struct GlobalKPMnode_ng_eNB_ID { + GlobalngeNB_ID_t global_ng_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalKPMnode_ng_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalKPMnode_ng_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalKPMnode_ng_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalKPMnode_ng_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalKPMnode_ng_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalenGNB-ID.c b/src/codec_utils/E2SMKPM/GlobalenGNB-ID.c new file mode 100644 index 000000000..f44449d63 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalenGNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalenGNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalenGNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalenGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1 = { + sizeof(struct GlobalenGNB_ID), + offsetof(struct GlobalenGNB_ID, _asn_ctx), + asn_MAP_GlobalenGNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = { + "GlobalenGNB-ID", + "GlobalenGNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalenGNB_ID_tags_1, + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalenGNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalenGNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalenGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalenGNB-ID.h b/src/codec_utils/E2SMKPM/GlobalenGNB-ID.h new file mode 100644 index 000000000..ba90baf34 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalenGNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalenGNB_ID_H_ +#define _GlobalenGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include "ENGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalenGNB-ID */ +typedef struct GlobalenGNB_ID { + PLMN_Identity_t pLMN_Identity; + ENGNB_ID_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalenGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalenGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalgNB-ID.c b/src/codec_utils/E2SMKPM/GlobalgNB-ID.c new file mode 100644 index 000000000..7736a443a --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalgNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalgNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, gnb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GNB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gnb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalgNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalgNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gnb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1 = { + sizeof(struct GlobalgNB_ID), + offsetof(struct GlobalgNB_ID, _asn_ctx), + asn_MAP_GlobalgNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID = { + "GlobalgNB-ID", + "GlobalgNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalgNB_ID_tags_1, + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalgNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalgNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalgNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalgNB-ID.h b/src/codec_utils/E2SMKPM/GlobalgNB-ID.h new file mode 100644 index 000000000..9e173173a --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalgNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalgNB_ID_H_ +#define _GlobalgNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include "GNB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalgNB-ID */ +typedef struct GlobalgNB_ID { + PLMN_Identity_t plmn_id; + GNB_ID_Choice_t gnb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalgNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalgNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/GlobalngeNB-ID.c b/src/codec_utils/E2SMKPM/GlobalngeNB-ID.c new file mode 100644 index 000000000..1b3521fdd --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalngeNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalngeNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, enb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "enb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalngeNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalngeNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1 = { + sizeof(struct GlobalngeNB_ID), + offsetof(struct GlobalngeNB_ID, _asn_ctx), + asn_MAP_GlobalngeNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID = { + "GlobalngeNB-ID", + "GlobalngeNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalngeNB_ID_tags_1, + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalngeNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalngeNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalngeNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/GlobalngeNB-ID.h b/src/codec_utils/E2SMKPM/GlobalngeNB-ID.h new file mode 100644 index 000000000..fda917ea3 --- /dev/null +++ b/src/codec_utils/E2SMKPM/GlobalngeNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalngeNB_ID_H_ +#define _GlobalngeNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include "ENB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalngeNB-ID */ +typedef struct GlobalngeNB_ID { + PLMN_Identity_t plmn_id; + ENB_ID_Choice_t enb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalngeNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalngeNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/INTEGER.c b/src/codec_utils/E2SMKPM/INTEGER.c new file mode 100644 index 000000000..2a2f4d720 --- /dev/null +++ b/src/codec_utils/E2SMKPM/INTEGER.c @@ -0,0 +1,1735 @@ +/*- + * Copyright (c) 2003-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* Encoder and decoder of a primitive type */ +#include + +/* + * INTEGER basic type description. + */ +static const ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_operation_t asn_OP_INTEGER = { + INTEGER_free, + INTEGER_print, + INTEGER_compare, + ber_decode_primitive, + INTEGER_encode_der, + INTEGER_decode_xer, + INTEGER_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + INTEGER_decode_oer, /* OER decoder */ + INTEGER_encode_oer, /* Canonical OER encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + INTEGER_decode_uper, /* Unaligned PER decoder */ + INTEGER_encode_uper, /* Unaligned PER encoder */ + INTEGER_decode_aper, /* Aligned PER decoder */ + INTEGER_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + INTEGER_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_INTEGER = { + "INTEGER", + "INTEGER", + &asn_OP_INTEGER, + asn_DEF_INTEGER_tags, + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + asn_DEF_INTEGER_tags, /* Same as above */ + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Encode INTEGER type using DER. + */ +asn_enc_rval_t +INTEGER_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + asn_enc_rval_t rval; + INTEGER_t effective_integer; + + ASN_DEBUG("%s %s as INTEGER (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + /* + * Canonicalize integer in the buffer. + * (Remove too long sign extension, remove some first 0x00 bytes) + */ + if(st->buf) { + uint8_t *buf = st->buf; + uint8_t *end1 = buf + st->size - 1; + int shift; + + /* Compute the number of superfluous leading bytes */ + for(; buf < end1; buf++) { + /* + * If the contents octets of an integer value encoding + * consist of more than one octet, then the bits of the + * first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + switch(*buf) { + case 0x00: if((buf[1] & 0x80) == 0) + continue; + break; + case 0xff: if((buf[1] & 0x80)) + continue; + break; + } + break; + } + + /* Remove leading superfluous bytes from the integer */ + shift = buf - st->buf; + if(shift) { + union { + const uint8_t *c_buf; + uint8_t *nc_buf; + } unconst; + unconst.c_buf = st->buf; + effective_integer.buf = unconst.nc_buf + shift; + effective_integer.size = st->size - shift; + + st = &effective_integer; + } + } + + rval = der_encode_primitive(td, st, tag_mode, tag, cb, app_key); + if(rval.structure_ptr == &effective_integer) { + rval.structure_ptr = sptr; + } + return rval; +} + +static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value( + const asn_INTEGER_specifics_t *specs, const char *lstart, + const char *lstop); + +/* + * INTEGER specific human-readable output. + */ +static ssize_t +INTEGER__dump(const asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; + uint8_t *buf = st->buf; + uint8_t *buf_end = st->buf + st->size; + intmax_t value; + ssize_t wrote = 0; + char *p; + int ret; + + if(specs && specs->field_unsigned) + ret = asn_INTEGER2umax(st, (uintmax_t *)&value); + else + ret = asn_INTEGER2imax(st, &value); + + /* Simple case: the integer size is small */ + if(ret == 0) { + const asn_INTEGER_enum_map_t *el; + el = (value >= 0 || !specs || !specs->field_unsigned) + ? INTEGER_map_value2enum(specs, value) : 0; + if(el) { + if(plainOrXER == 0) + return asn__format_to_callback(cb, app_key, + "%" ASN_PRIdMAX " (%s)", value, el->enum_name); + else + return asn__format_to_callback(cb, app_key, + "<%s/>", el->enum_name); + } else if(plainOrXER && specs && specs->strict_enumeration) { + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + errno = EPERM; + return -1; + } else { + return asn__format_to_callback(cb, app_key, + (specs && specs->field_unsigned) + ? "%" ASN_PRIuMAX + : "%" ASN_PRIdMAX, + value); + } + } else if(plainOrXER && specs && specs->strict_enumeration) { + /* + * Here and earlier, we cannot encode the ENUMERATED values + * if there is no corresponding identifier. + */ + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + errno = EPERM; + return -1; + } + + /* Output in the long xx:yy:zz... format */ + /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ + for(p = scratch; buf < buf_end; buf++) { + const char * const h2c = "0123456789ABCDEF"; + if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { + /* Flush buffer */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + wrote += p - scratch; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x3a; /* ":" */ + } + if(p != scratch) + p--; /* Remove the last ":" */ + + wrote += p - scratch; + return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; +} + +/* + * INTEGER specific human-readable output. + */ +int +INTEGER_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + ssize_t ret; + + (void)ilevel; + + if(!st || !st->buf) + ret = cb("", 8, app_key); + else + ret = INTEGER__dump(td, st, cb, app_key, 0); + + return (ret < 0) ? -1 : 0; +} + +struct e2v_key { + const char *start; + const char *stop; + const asn_INTEGER_enum_map_t *vemap; + const unsigned int *evmap; +}; +static int +INTEGER__compar_enum2value(const void *kp, const void *am) { + const struct e2v_key *key = (const struct e2v_key *)kp; + const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; + const char *ptr, *end, *name; + + /* Remap the element (sort by different criterion) */ + el = key->vemap + key->evmap[el - key->vemap]; + + /* Compare strings */ + for(ptr = key->start, end = key->stop, name = el->enum_name; + ptr < end; ptr++, name++) { + if(*ptr != *name || !*name) + return *(const unsigned char *)ptr + - *(const unsigned char *)name; + } + return name[0] ? -1 : 0; +} + +static const asn_INTEGER_enum_map_t * +INTEGER_map_enum2value(const asn_INTEGER_specifics_t *specs, const char *lstart, + const char *lstop) { + const asn_INTEGER_enum_map_t *el_found; + int count = specs ? specs->map_count : 0; + struct e2v_key key; + const char *lp; + + if(!count) return NULL; + + /* Guaranteed: assert(lstart < lstop); */ + /* Figure out the tag name */ + for(lstart++, lp = lstart; lp < lstop; lp++) { + switch(*lp) { + case 9: case 10: case 11: case 12: case 13: case 32: /* WSP */ + case 0x2f: /* '/' */ case 0x3e: /* '>' */ + break; + default: + continue; + } + break; + } + if(lp == lstop) return NULL; /* No tag found */ + lstop = lp; + + key.start = lstart; + key.stop = lstop; + key.vemap = specs->value2enum; + key.evmap = specs->enum2value; + el_found = (asn_INTEGER_enum_map_t *)bsearch(&key, + specs->value2enum, count, sizeof(specs->value2enum[0]), + INTEGER__compar_enum2value); + if(el_found) { + /* Remap enum2value into value2enum */ + el_found = key.vemap + key.evmap[el_found - key.vemap]; + } + return el_found; +} + +static int +INTEGER__compar_value2enum(const void *kp, const void *am) { + long a = *(const long *)kp; + const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; + long b = el->nat_value; + if(a < b) return -1; + else if(a == b) return 0; + else return 1; +} + +const asn_INTEGER_enum_map_t * +INTEGER_map_value2enum(const asn_INTEGER_specifics_t *specs, long value) { + int count = specs ? specs->map_count : 0; + if(!count) return 0; + return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum, + count, sizeof(specs->value2enum[0]), + INTEGER__compar_value2enum); +} + +static int +INTEGER_st_prealloc(INTEGER_t *st, int min_size) { + void *p = MALLOC(min_size + 1); + if(p) { + void *b = st->buf; + st->size = 0; + st->buf = p; + FREEMEM(b); + return 0; + } else { + return -1; + } +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static enum xer_pbd_rval +INTEGER__xer_body_decode(const asn_TYPE_descriptor_t *td, void *sptr, + const void *chunk_buf, size_t chunk_size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + INTEGER_t *st = (INTEGER_t *)sptr; + intmax_t dec_value; + intmax_t hex_value = 0; + const char *lp; + const char *lstart = (const char *)chunk_buf; + const char *lstop = lstart + chunk_size; + enum { + ST_LEADSPACE, + ST_SKIPSPHEX, + ST_WAITDIGITS, + ST_DIGITS, + ST_DIGITS_TRAILSPACE, + ST_HEXDIGIT1, + ST_HEXDIGIT2, + ST_HEXDIGITS_TRAILSPACE, + ST_HEXCOLON, + ST_END_ENUM, + ST_UNEXPECTED + } state = ST_LEADSPACE; + const char *dec_value_start = 0; /* INVARIANT: always !0 in ST_DIGITS */ + const char *dec_value_end = 0; + + if(chunk_size) + ASN_DEBUG("INTEGER body %ld 0x%2x..0x%2x", + (long)chunk_size, *lstart, lstop[-1]); + + if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) + return XPBD_SYSTEM_FAILURE; + + /* + * We may have received a tag here. It will be processed inline. + * Use strtoul()-like code and serialize the result. + */ + for(lp = lstart; lp < lstop; lp++) { + int lv = *lp; + switch(lv) { + case 0x09: case 0x0a: case 0x0d: case 0x20: + switch(state) { + case ST_LEADSPACE: + case ST_DIGITS_TRAILSPACE: + case ST_HEXDIGITS_TRAILSPACE: + case ST_SKIPSPHEX: + continue; + case ST_DIGITS: + dec_value_end = lp; + state = ST_DIGITS_TRAILSPACE; + continue; + case ST_HEXCOLON: + state = ST_HEXDIGITS_TRAILSPACE; + continue; + default: + break; + } + break; + case 0x2d: /* '-' */ + if(state == ST_LEADSPACE) { + dec_value = 0; + dec_value_start = lp; + state = ST_WAITDIGITS; + continue; + } + break; + case 0x2b: /* '+' */ + if(state == ST_LEADSPACE) { + dec_value = 0; + dec_value_start = lp; + state = ST_WAITDIGITS; + continue; + } + break; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + switch(state) { + case ST_DIGITS: continue; + case ST_SKIPSPHEX: /* Fall through */ + case ST_HEXDIGIT1: + hex_value = (lv - 0x30) << 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + hex_value += (lv - 0x30); + state = ST_HEXCOLON; + st->buf[st->size++] = (uint8_t)hex_value; + continue; + case ST_HEXCOLON: + return XPBD_BROKEN_ENCODING; + case ST_LEADSPACE: + dec_value = 0; + dec_value_start = lp; + /* FALL THROUGH */ + case ST_WAITDIGITS: + state = ST_DIGITS; + continue; + default: + break; + } + break; + case 0x3c: /* '<', start of XML encoded enumeration */ + if(state == ST_LEADSPACE) { + const asn_INTEGER_enum_map_t *el; + el = INTEGER_map_enum2value( + (const asn_INTEGER_specifics_t *) + td->specifics, lstart, lstop); + if(el) { + ASN_DEBUG("Found \"%s\" => %ld", + el->enum_name, el->nat_value); + dec_value = el->nat_value; + state = ST_END_ENUM; + lp = lstop - 1; + continue; + } + ASN_DEBUG("Unknown identifier for INTEGER"); + } + return XPBD_BROKEN_ENCODING; + case 0x3a: /* ':' */ + if(state == ST_HEXCOLON) { + /* This colon is expected */ + state = ST_HEXDIGIT1; + continue; + } else if(state == ST_DIGITS) { + /* The colon here means that we have + * decoded the first two hexadecimal + * places as a decimal value. + * Switch decoding mode. */ + ASN_DEBUG("INTEGER re-evaluate as hex form"); + state = ST_SKIPSPHEX; + dec_value_start = 0; + lp = lstart - 1; + continue; + } else { + ASN_DEBUG("state %d at %ld", state, (long)(lp - lstart)); + break; + } + /* [A-Fa-f] */ + case 0x41:case 0x42:case 0x43:case 0x44:case 0x45:case 0x46: + case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66: + switch(state) { + case ST_SKIPSPHEX: + case ST_LEADSPACE: /* Fall through */ + case ST_HEXDIGIT1: + hex_value = lv - ((lv < 0x61) ? 0x41 : 0x61); + hex_value += 10; + hex_value <<= 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + hex_value += lv - ((lv < 0x61) ? 0x41 : 0x61); + hex_value += 10; + st->buf[st->size++] = (uint8_t)hex_value; + state = ST_HEXCOLON; + continue; + case ST_DIGITS: + ASN_DEBUG("INTEGER re-evaluate as hex form"); + state = ST_SKIPSPHEX; + dec_value_start = 0; + lp = lstart - 1; + continue; + default: + break; + } + break; + } + + /* Found extra non-numeric stuff */ + ASN_DEBUG("INTEGER :: Found non-numeric 0x%2x at %ld", + lv, (long)(lp - lstart)); + state = ST_UNEXPECTED; + break; + } + + switch(state) { + case ST_END_ENUM: + /* Got a complete and valid enumeration encoded as a tag. */ + break; + case ST_DIGITS: + dec_value_end = lstop; + /* FALL THROUGH */ + case ST_DIGITS_TRAILSPACE: + /* The last symbol encountered was a digit. */ + switch(asn_strtoimax_lim(dec_value_start, &dec_value_end, &dec_value)) { + case ASN_STRTOX_OK: + if(specs && specs->field_unsigned && (uintmax_t) dec_value <= ULONG_MAX) { + break; + } else if(dec_value >= LONG_MIN && dec_value <= LONG_MAX) { + break; + } else { + /* + * We model INTEGER on long for XER, + * to avoid rewriting all the tests at once. + */ + ASN_DEBUG("INTEGER exceeds long range"); + } + /* Fall through */ + case ASN_STRTOX_ERROR_RANGE: + ASN_DEBUG("INTEGER decode %s hit range limit", td->name); + return XPBD_DECODER_LIMIT; + case ASN_STRTOX_ERROR_INVAL: + case ASN_STRTOX_EXPECT_MORE: + case ASN_STRTOX_EXTRA_DATA: + return XPBD_BROKEN_ENCODING; + } + break; + case ST_HEXCOLON: + case ST_HEXDIGITS_TRAILSPACE: + st->buf[st->size] = 0; /* Just in case termination */ + return XPBD_BODY_CONSUMED; + case ST_HEXDIGIT1: + case ST_HEXDIGIT2: + case ST_SKIPSPHEX: + return XPBD_BROKEN_ENCODING; + case ST_LEADSPACE: + /* Content not found */ + return XPBD_NOT_BODY_IGNORE; + case ST_WAITDIGITS: + case ST_UNEXPECTED: + ASN_DEBUG("INTEGER: No useful digits (state %d)", state); + return XPBD_BROKEN_ENCODING; /* No digits */ + } + + /* + * Convert the result of parsing of enumeration or a straight + * decimal value into a BER representation. + */ + if(asn_imax2INTEGER(st, dec_value)) { + ASN_DEBUG("INTEGER decode %s conversion failed", td->name); + return XPBD_SYSTEM_FAILURE; + } + + return XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +INTEGER_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(INTEGER_t), opt_mname, + buf_ptr, size, INTEGER__xer_body_decode); +} + +asn_enc_rval_t +INTEGER_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + asn_enc_rval_t er = {0,0,0}; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) + ASN__ENCODE_FAILED; + + er.encoded = INTEGER__dump(td, st, cb, app_key, 1); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +INTEGER_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + INTEGER_t *st = (INTEGER_t *)*sptr; + const asn_per_constraint_t *ct; + int repeat; + + (void)opt_codec_ctx; + + if(!st) { + st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + if(!constraints) constraints = td->encoding_constraints.per_constraints; + ct = constraints ? &constraints->value : 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + if(ct) { + if(ct->flags & APC_SEMI_CONSTRAINED) { + st->buf = (uint8_t *)CALLOC(1, 2); + if(!st->buf) ASN__DECODE_FAILED; + st->size = 1; + } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { + size_t size = (ct->range_bits + 7) >> 3; + st->buf = (uint8_t *)MALLOC(1 + size + 1); + if(!st->buf) ASN__DECODE_FAILED; + st->size = size; + } + } + + /* X.691-2008/11, #13.2.2, constrained whole number */ + if(ct && ct->flags != APC_UNCONSTRAINED) { + /* #11.5.6 */ + ASN_DEBUG("Integer with range %d bits", ct->range_bits); + if(ct->range_bits >= 0) { + if((size_t)ct->range_bits > 8 * sizeof(unsigned long)) + ASN__DECODE_FAILED; + + if(specs && specs->field_unsigned) { + unsigned long uvalue = 0; + if(uper_get_constrained_whole_number(pd, + &uvalue, ct->range_bits)) + ASN__DECODE_STARVED; + ASN_DEBUG("Got value %lu + low %ld", + uvalue, ct->lower_bound); + uvalue += ct->lower_bound; + if(asn_ulong2INTEGER(st, uvalue)) + ASN__DECODE_FAILED; + } else { + unsigned long uvalue = 0; + long svalue; + if(uper_get_constrained_whole_number(pd, + &uvalue, ct->range_bits)) + ASN__DECODE_STARVED; + ASN_DEBUG("Got value %lu + low %ld", + uvalue, ct->lower_bound); + if(per_long_range_unrebase(uvalue, ct->lower_bound, + ct->upper_bound, &svalue) + || asn_long2INTEGER(st, svalue)) { + ASN__DECODE_FAILED; + } + } + return rval; + } + } else { + ASN_DEBUG("Decoding unconstrained integer %s", td->name); + } + + /* X.691, #12.2.3, #12.2.4 */ + do { + ssize_t len = 0; + void *p = NULL; + int ret = 0; + + /* Get the PER length */ + len = uper_get_length(pd, -1, 0, &repeat); + if(len < 0) ASN__DECODE_STARVED; + + p = REALLOC(st->buf, st->size + len + 1); + if(!p) ASN__DECODE_FAILED; + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); + if(ret < 0) ASN__DECODE_STARVED; + st->size += len; + } while(repeat); + st->buf[st->size] = 0; /* JIC */ + + /* #12.2.3 */ + if(ct && ct->lower_bound) { + /* + * TODO: replace by in-place arithmetics. + */ + long value = 0; + if(asn_INTEGER2long(st, &value)) + ASN__DECODE_FAILED; + if(asn_imax2INTEGER(st, value + ct->lower_bound)) + ASN__DECODE_FAILED; + } + + return rval; +} + +asn_enc_rval_t +INTEGER_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + const INTEGER_t *st = (const INTEGER_t *)sptr; + const uint8_t *buf; + const uint8_t *end; + const asn_per_constraint_t *ct; + long value = 0; + + if(!st || st->size == 0) ASN__ENCODE_FAILED; + + if(!constraints) constraints = td->encoding_constraints.per_constraints; + ct = constraints ? &constraints->value : 0; + + er.encoded = 0; + + if(ct) { + int inext = 0; + if(specs && specs->field_unsigned) { + unsigned long uval; + if(asn_INTEGER2ulong(st, &uval)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(uval < (unsigned long)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(uval < (unsigned long)ct->lower_bound + || uval > (unsigned long)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%" ASN_PRI_SIZE ") lb %lu ub %lu %s", + uval, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + value = uval; + } else { + if(asn_INTEGER2long(st, &value)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value < ct->lower_bound + || value > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %ld (%02x/%" ASN_PRI_SIZE ") lb %ld ub %ld %s", + value, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + } + + + /* X.691-11/2008, #13.2.2, test if constrained whole number */ + if(ct && ct->range_bits >= 0) { + unsigned long v; + /* #11.5.6 -> #11.3 */ + ASN_DEBUG("Encoding integer %ld (%lu) with range %d bits", + value, value - ct->lower_bound, ct->range_bits); + if(specs && specs->field_unsigned) { + if ( ((unsigned long)ct->lower_bound > (unsigned long)(ct->upper_bound) + || ((unsigned long)value < (unsigned long)ct->lower_bound)) + || ((unsigned long)value > (unsigned long)ct->upper_bound) + ) { + ASN_DEBUG("Value %lu to-be-encoded is outside the bounds [%lu, %lu]!", + value, ct->lower_bound, ct->upper_bound); + ASN__ENCODE_FAILED; + } + v = (unsigned long)value - (unsigned long)ct->lower_bound; + } else { + if(per_long_range_rebase(value, ct->lower_bound, ct->upper_bound, &v)) { + ASN__ENCODE_FAILED; + } + } + if(uper_put_constrained_whole_number_u(po, v, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(ct && ct->lower_bound) { + ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound); + /* TODO: adjust lower bound */ + ASN__ENCODE_FAILED; + } + + for(buf = st->buf, end = st->buf + st->size; buf < end;) { + int need_eom = 0; + ssize_t mayEncode = uper_put_length(po, end - buf, &need_eom); + if(mayEncode < 0) + ASN__ENCODE_FAILED; + if(per_put_many_bits(po, buf, 8 * mayEncode)) + ASN__ENCODE_FAILED; + buf += mayEncode; + if(need_eom && uper_put_length(po, 0, 0)) ASN__ENCODE_FAILED; + } + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +INTEGER_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + INTEGER_t *st = (INTEGER_t *)*sptr; + const asn_per_constraint_t *ct; + int repeat; + + (void)opt_codec_ctx; + + if(!st) { + st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + if(!constraints) constraints = td->encoding_constraints.per_constraints; + ct = constraints ? &constraints->value : 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + if(ct) { + if(ct->flags & APC_SEMI_CONSTRAINED) { + st->buf = (uint8_t *)CALLOC(1, 2); + if(!st->buf) ASN__DECODE_FAILED; + st->size = 1; + } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { + size_t size = (ct->range_bits + 7) >> 3; + st->buf = (uint8_t *)MALLOC(1 + size + 1); + if(!st->buf) ASN__DECODE_FAILED; + st->size = size; + } + } + + /* X.691, #12.2.2 */ + if(ct && ct->flags != APC_UNCONSTRAINED) { + /* #10.5.6 */ + ASN_DEBUG("Integer with range %d bits", ct->range_bits); + if(ct->range_bits >= 0) { + if (ct->range_bits > 16) { + int max_range_bytes = (ct->range_bits >> 3) + + (((ct->range_bits % 8) > 0) ? 1 : 0); + int length = 0, i; + long value = 0; + + for (i = 1; ; i++) { + int upper = 1 << i; + if (upper >= max_range_bytes) + break; + } + ASN_DEBUG("Can encode %d (%d bytes) in %d bits", ct->range_bits, + max_range_bytes, i); + + if ((length = per_get_few_bits(pd, i)) < 0) + ASN__DECODE_FAILED; + + /* X.691 #12.2.6 length determinant + lb (1) */ + length += 1; + ASN_DEBUG("Got length %d", length); + if (aper_get_align(pd) != 0) + ASN__DECODE_FAILED; + while (length--) { + int buf = per_get_few_bits(pd, 8); + if (buf < 0) + ASN__DECODE_FAILED; + value += (((long)buf) << (8 * length)); + } + + value += ct->lower_bound; + if((specs && specs->field_unsigned) + ? asn_uint642INTEGER(st, (unsigned long)value) + : asn_int642INTEGER(st, value)) + ASN__DECODE_FAILED; + ASN_DEBUG("Got value %ld + low %ld", + value, ct->lower_bound); + } else { + long value = 0; + if (ct->range_bits < 8) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + } else if (ct->range_bits == 8) { + if (aper_get_align(pd) < 0) + ASN__DECODE_FAILED; + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + } else { + /* Align */ + if (aper_get_align(pd) < 0) + ASN__DECODE_FAILED; + value = per_get_few_bits(pd, 16); + if(value < 0) ASN__DECODE_STARVED; + } + value += ct->lower_bound; + if((specs && specs->field_unsigned) + ? asn_ulong2INTEGER(st, value) + : asn_long2INTEGER(st, value)) + ASN__DECODE_FAILED; + ASN_DEBUG("Got value %ld + low %ld", + value, ct->lower_bound); + } + return rval; + } else { + ASN__DECODE_FAILED; + } + } else { + ASN_DEBUG("Decoding unconstrained integer %s", td->name); + } + + /* X.691, #12.2.3, #12.2.4 */ + do { + ssize_t len; + void *p; + int ret; + + /* Get the PER length */ + len = aper_get_length(pd, -1, -1, &repeat); + if(len < 0) ASN__DECODE_STARVED; + + p = REALLOC(st->buf, st->size + len + 1); + if(!p) ASN__DECODE_FAILED; + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); + if(ret < 0) ASN__DECODE_STARVED; + st->size += len; + } while(repeat); + st->buf[st->size] = 0; /* JIC */ + + /* #12.2.3 */ + if(ct && ct->lower_bound) { + /* + * TODO: replace by in-place arithmetics. + */ + long value; + if(asn_INTEGER2long(st, &value)) + ASN__DECODE_FAILED; + if(asn_long2INTEGER(st, value + ct->lower_bound)) + ASN__DECODE_FAILED; + } + + return rval; +} + +asn_enc_rval_t +INTEGER_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + const INTEGER_t *st = (const INTEGER_t *)sptr; + const uint8_t *buf; + const uint8_t *end; + const asn_per_constraint_t *ct; + long value = 0; + + if(!st || st->size == 0) ASN__ENCODE_FAILED; + + if(!constraints) constraints = td->encoding_constraints.per_constraints; + ct = constraints ? &constraints->value : 0; + + er.encoded = 0; + + if(ct) { + int inext = 0; + if(specs && specs->field_unsigned) { + unsigned long uval; + if(asn_INTEGER2ulong(st, &uval)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(uval < (unsigned long)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(uval < (unsigned long)ct->lower_bound + || uval > (unsigned long)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%lu) lb %ld ub %ld %s", + uval, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + value = uval; + } else { + if(asn_INTEGER2long(st, &value)) ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value < ct->lower_bound + || value > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%lu) lb %ld ub %ld %s", + value, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + } + + /* X.691, #12.2.2 */ + if(ct && ct->range_bits >= 0) { + unsigned long v; + + /* #10.5.6 */ + ASN_DEBUG("Encoding integer %ld (%lu) with range %d bits", + value, value - ct->lower_bound, ct->range_bits); + + v = value - ct->lower_bound; + + /* #12 <= 8 -> alignment ? */ + if (ct->range_bits < 8) { + if(per_put_few_bits(po, 0x00 | v, ct->range_bits)) + ASN__ENCODE_FAILED; + } else if (ct->range_bits == 8) { + if(aper_put_align(po) < 0) + ASN__ENCODE_FAILED; + if(per_put_few_bits(po, 0x00 | v, ct->range_bits)) + ASN__ENCODE_FAILED; + } else if (ct->range_bits <= 16) { + /* Consume the bytes to align on octet */ + if(aper_put_align(po) < 0) + ASN__ENCODE_FAILED; + if(per_put_few_bits(po, 0x0000 | v, + 16)) + ASN__ENCODE_FAILED; + } else { + /* TODO: extend to >64 bits */ + int64_t v64 = v; + int i, j; + int max_range_bytes = (ct->range_bits >> 3) + + (((ct->range_bits % 8) > 0) ? 1 : 0); + + for (i = 1; ; i++) { + int upper = 1 << i; + if (upper >= max_range_bytes) + break; + } + + for (j = sizeof(int64_t) -1; j != 0; j--) { + int64_t val; + val = v64 >> (j * 8); + if (val != 0) + break; + } + + /* Putting length in the minimum number of bits ex: 5 = 3bits */ + if (per_put_few_bits(po, j, i)) + ASN__ENCODE_FAILED; + + /* Consume the bits to align on octet */ + if (aper_put_align(po) < 0) + ASN__ENCODE_FAILED; + /* Put the value */ + for (i = 0; i <= j; i++) { + if(per_put_few_bits(po, (v64 >> (8 * (j - i))) & 0xff, 8)) + ASN__ENCODE_FAILED; + } + } + ASN__ENCODED_OK(er); + } + + if(ct && ct->lower_bound) { + ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound); + /* TODO: adjust lower bound */ + ASN__ENCODE_FAILED; + } + + for(buf = st->buf, end = st->buf + st->size; buf < end;) { + ssize_t mayEncode = aper_put_length(po, -1, end - buf); + if(mayEncode < 0) + ASN__ENCODE_FAILED; + if(per_put_many_bits(po, buf, 8 * mayEncode)) + ASN__ENCODE_FAILED; + buf += mayEncode; + } + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +static intmax_t +asn__integer_convert(const uint8_t *b, const uint8_t *end) { + uintmax_t value; + + /* Perform the sign initialization */ + /* Actually value = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) { + value = (uintmax_t)(-1); + } else { + value = 0; + } + + /* Conversion engine */ + for(; b < end; b++) { + value = (value << 8) | *b; + } + + return value; +} + +int +asn_INTEGER2imax(const INTEGER_t *iptr, intmax_t *lptr) { + uint8_t *b, *end; + size_t size; + + /* Sanity checking */ + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + /* Cache the begin/end of the buffer */ + b = iptr->buf; /* Start of the INTEGER buffer */ + size = iptr->size; + end = b + size; /* Where to stop */ + + if(size > sizeof(intmax_t)) { + uint8_t *end1 = end - 1; + /* + * Slightly more advanced processing, + * able to process INTEGERs with >sizeof(intmax_t) bytes + * when the actual value is small, e.g. for intmax_t == int32_t + * (0x0000000000abcdef INTEGER would yield a fine 0x00abcdef int32_t) + */ + /* Skip out the insignificant leading bytes */ + for(; b < end1; b++) { + switch(*b) { + case 0x00: if((b[1] & 0x80) == 0) continue; break; + case 0xff: if((b[1] & 0x80) != 0) continue; break; + } + break; + } + + size = end - b; + if(size > sizeof(intmax_t)) { + /* Still cannot fit the sizeof(intmax_t) */ + errno = ERANGE; + return -1; + } + } + + /* Shortcut processing of a corner case */ + if(end == b) { + *lptr = 0; + return 0; + } + + *lptr = asn__integer_convert(b, end); + return 0; +} + +/* FIXME: negative INTEGER values are silently interpreted as large unsigned ones. */ +int +asn_INTEGER2umax(const INTEGER_t *iptr, uintmax_t *lptr) { + uint8_t *b, *end; + uintmax_t value; + size_t size; + + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + b = iptr->buf; + size = iptr->size; + end = b + size; + + /* If all extra leading bytes are zeroes, ignore them */ + for(; size > sizeof(value); b++, size--) { + if(*b) { + /* Value won't fit into uintmax_t */ + errno = ERANGE; + return -1; + } + } + + /* Conversion engine */ + for(value = 0; b < end; b++) + value = (value << 8) | *b; + + *lptr = value; + return 0; +} + +int +asn_umax2INTEGER(INTEGER_t *st, uintmax_t value) { + uint8_t *buf; + uint8_t *end; + uint8_t *b; + int shr; + + if(value <= ((~(uintmax_t)0) >> 1)) { + return asn_imax2INTEGER(st, value); + } + + buf = (uint8_t *)MALLOC(1 + sizeof(value)); + if(!buf) return -1; + + end = buf + (sizeof(value) + 1); + buf[0] = 0; /* INTEGERs are signed. 0-byte indicates positive. */ + for(b = buf + 1, shr = (sizeof(value) - 1) * 8; b < end; shr -= 8, b++) + *b = (uint8_t)(value >> shr); + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = 1 + sizeof(value); + + return 0; +} + +int +asn_imax2INTEGER(INTEGER_t *st, intmax_t value) { + uint8_t *buf, *bp; + uint8_t *p; + uint8_t *pstart; + uint8_t *pend1; + int littleEndian = 1; /* Run-time detection */ + int add; + + if(!st) { + errno = EINVAL; + return -1; + } + + buf = (uint8_t *)(long *)MALLOC(sizeof(value)); + if(!buf) return -1; + + if(*(char *)&littleEndian) { + pstart = (uint8_t *)&value + sizeof(value) - 1; + pend1 = (uint8_t *)&value; + add = -1; + } else { + pstart = (uint8_t *)&value; + pend1 = pstart + sizeof(value) - 1; + add = 1; + } + + /* + * If the contents octet consists of more than one octet, + * then bits of the first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + for(p = pstart; p != pend1; p += add) { + switch(*p) { + case 0x00: if((*(p+add) & 0x80) == 0) + continue; + break; + case 0xff: if((*(p+add) & 0x80)) + continue; + break; + } + break; + } + /* Copy the integer body */ + for(bp = buf, pend1 += add; p != pend1; p += add) + *bp++ = *p; + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = bp - buf; + + return 0; +} + +int +asn_INTEGER2long(const INTEGER_t *iptr, long *l) { + intmax_t v; + if(asn_INTEGER2imax(iptr, &v) == 0) { + if(v < LONG_MIN || v > LONG_MAX) { + errno = ERANGE; + return -1; + } + *l = v; + return 0; + } else { + return -1; + } +} + +int +asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *l) { + uintmax_t v; + if(asn_INTEGER2umax(iptr, &v) == 0) { + if(v > ULONG_MAX) { + errno = ERANGE; + return -1; + } + *l = v; + return 0; + } else { + return -1; + } +} + +int +asn_long2INTEGER(INTEGER_t *st, long value) { + return asn_imax2INTEGER(st, value); +} + +int +asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { + return asn_imax2INTEGER(st, value); +} + + +int +asn_uint642INTEGER(INTEGER_t *st, uint64_t value) { + uint8_t *buf; + uint8_t *end; + uint8_t *b; + int shr; + + if(value <= INT64_MAX) + return asn_int642INTEGER(st, value); + + buf = (uint8_t *)MALLOC(1 + sizeof(value)); + if(!buf) return -1; + + end = buf + (sizeof(value) + 1); + buf[0] = 0; + for(b = buf + 1, shr = (sizeof(value)-1)*8; b < end; shr -= 8, b++) + *b = (uint8_t)(value >> shr); + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = 1 + sizeof(value); + + return 0; +} + +int +asn_int642INTEGER(INTEGER_t *st, int64_t value) { + uint8_t *buf, *bp; + uint8_t *p; + uint8_t *pstart; + uint8_t *pend1; + int littleEndian = 1; /* Run-time detection */ + int add; + + if(!st) { + errno = EINVAL; + return -1; + } + + buf = (uint8_t *)MALLOC(sizeof(value)); + if(!buf) return -1; + + if(*(char *)&littleEndian) { + pstart = (uint8_t *)&value + sizeof(value) - 1; + pend1 = (uint8_t *)&value; + add = -1; + } else { + pstart = (uint8_t *)&value; + pend1 = pstart + sizeof(value) - 1; + add = 1; + } + + /* + * If the contents octet consists of more than one octet, + * then bits of the first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + for(p = pstart; p != pend1; p += add) { + switch(*p) { + case 0x00: if((*(p+add) & 0x80) == 0) + continue; + break; + case 0xff: if((*(p+add) & 0x80)) + continue; + break; + } + break; + } + /* Copy the integer body */ + for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add) + *bp++ = *p; + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = bp - buf; + + return 0; +} + +/* + * Parse the number in the given string until the given *end position, + * returning the position after the last parsed character back using the + * same (*end) pointer. + * WARNING: This behavior is different from the standard strtol/strtoimax(3). + */ +enum asn_strtox_result_e +asn_strtoimax_lim(const char *str, const char **end, intmax_t *intp) { + int sign = 1; + intmax_t value; + +#define ASN1_INTMAX_MAX ((~(uintmax_t)0) >> 1) + const intmax_t upper_boundary = ASN1_INTMAX_MAX / 10; + intmax_t last_digit_max = ASN1_INTMAX_MAX % 10; +#undef ASN1_INTMAX_MAX + + if(str >= *end) return ASN_STRTOX_ERROR_INVAL; + + switch(*str) { + case '-': + last_digit_max++; + sign = -1; + /* FALL THROUGH */ + case '+': + str++; + if(str >= *end) { + *end = str; + return ASN_STRTOX_EXPECT_MORE; + } + } + + for(value = 0; str < (*end); str++) { + switch(*str) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: { + int d = *str - '0'; + if(value < upper_boundary) { + value = value * 10 + d; + } else if(value == upper_boundary) { + if(d <= last_digit_max) { + if(sign > 0) { + value = value * 10 + d; + } else { + sign = 1; + value = -value * 10 - d; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } + continue; + default: + *end = str; + *intp = sign * value; + return ASN_STRTOX_EXTRA_DATA; + } + } + + *end = str; + *intp = sign * value; + return ASN_STRTOX_OK; +} + +/* + * Parse the number in the given string until the given *end position, + * returning the position after the last parsed character back using the + * same (*end) pointer. + * WARNING: This behavior is different from the standard strtoul/strtoumax(3). + */ +enum asn_strtox_result_e +asn_strtoumax_lim(const char *str, const char **end, uintmax_t *uintp) { + uintmax_t value; + +#define ASN1_UINTMAX_MAX ((~(uintmax_t)0)) + const uintmax_t upper_boundary = ASN1_UINTMAX_MAX / 10; + uintmax_t last_digit_max = ASN1_UINTMAX_MAX % 10; +#undef ASN1_UINTMAX_MAX + + if(str >= *end) return ASN_STRTOX_ERROR_INVAL; + + switch(*str) { + case '-': + return ASN_STRTOX_ERROR_INVAL; + case '+': + str++; + if(str >= *end) { + *end = str; + return ASN_STRTOX_EXPECT_MORE; + } + } + + for(value = 0; str < (*end); str++) { + switch(*str) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: { + unsigned int d = *str - '0'; + if(value < upper_boundary) { + value = value * 10 + d; + } else if(value == upper_boundary) { + if(d <= last_digit_max) { + value = value * 10 + d; + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOX_ERROR_RANGE; + } + } + continue; + default: + *end = str; + *uintp = value; + return ASN_STRTOX_EXTRA_DATA; + } + } + + *end = str; + *uintp = value; + return ASN_STRTOX_OK; +} + +enum asn_strtox_result_e +asn_strtol_lim(const char *str, const char **end, long *lp) { + intmax_t value; + switch(asn_strtoimax_lim(str, end, &value)) { + case ASN_STRTOX_ERROR_RANGE: + return ASN_STRTOX_ERROR_RANGE; + case ASN_STRTOX_ERROR_INVAL: + return ASN_STRTOX_ERROR_INVAL; + case ASN_STRTOX_EXPECT_MORE: + return ASN_STRTOX_EXPECT_MORE; + case ASN_STRTOX_OK: + if(value >= LONG_MIN && value <= LONG_MAX) { + *lp = value; + return ASN_STRTOX_OK; + } else { + return ASN_STRTOX_ERROR_RANGE; + } + case ASN_STRTOX_EXTRA_DATA: + if(value >= LONG_MIN && value <= LONG_MAX) { + *lp = value; + return ASN_STRTOX_EXTRA_DATA; + } else { + return ASN_STRTOX_ERROR_RANGE; + } + } + + assert(!"Unreachable"); + return ASN_STRTOX_ERROR_INVAL; +} + +enum asn_strtox_result_e +asn_strtoul_lim(const char *str, const char **end, unsigned long *ulp) { + uintmax_t value; + switch(asn_strtoumax_lim(str, end, &value)) { + case ASN_STRTOX_ERROR_RANGE: + return ASN_STRTOX_ERROR_RANGE; + case ASN_STRTOX_ERROR_INVAL: + return ASN_STRTOX_ERROR_INVAL; + case ASN_STRTOX_EXPECT_MORE: + return ASN_STRTOX_EXPECT_MORE; + case ASN_STRTOX_OK: + if(value <= ULONG_MAX) { + *ulp = value; + return ASN_STRTOX_OK; + } else { + return ASN_STRTOX_ERROR_RANGE; + } + case ASN_STRTOX_EXTRA_DATA: + if(value <= ULONG_MAX) { + *ulp = value; + return ASN_STRTOX_EXTRA_DATA; + } else { + return ASN_STRTOX_ERROR_RANGE; + } + } + + assert(!"Unreachable"); + return ASN_STRTOX_ERROR_INVAL; +} + +int +INTEGER_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const INTEGER_t *a = aptr; + const INTEGER_t *b = bptr; + + (void)td; + + if(a && b) { + if(a->size && b->size) { + int sign_a = (a->buf[0] & 0x80) ? -1 : 1; + int sign_b = (b->buf[0] & 0x80) ? -1 : 1; + + if(sign_a < sign_b) return -1; + if(sign_a > sign_b) return 1; + + /* The shortest integer wins, unless comparing negatives */ + if(a->size < b->size) { + return -1 * sign_a; + } else if(a->size > b->size) { + return 1 * sign_b; + } + + return sign_a * memcmp(a->buf, b->buf, a->size); + } else if(a->size) { + int sign = (a->buf[0] & 0x80) ? -1 : 1; + return (1) * sign; + } else if(b->size) { + int sign = (a->buf[0] & 0x80) ? -1 : 1; + return (-1) * sign; + } else { + return 0; + } + } else if(!a && !b) { + return 0; + } else if(!a) { + return -1; + } else { + return 1; + } + +} + +asn_random_fill_result_t +INTEGER_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + INTEGER_t *st = *sptr; + const asn_INTEGER_enum_map_t *emap; + size_t emap_len; + intmax_t value; + int find_inside_map; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (INTEGER_t *)CALLOC(1, sizeof(*st)); + if(st == NULL) { + return result_failed; + } + } + + if(specs) { + emap = specs->value2enum; + emap_len = specs->map_count; + if(specs->strict_enumeration) { + find_inside_map = emap_len > 0; + } else { + find_inside_map = emap_len ? asn_random_between(0, 1) : 0; + } + } else { + emap = 0; + emap_len = 0; + find_inside_map = 0; + } + + if(find_inside_map) { + assert(emap_len > 0); + value = emap[asn_random_between(0, emap_len - 1)].nat_value; + } else { + const asn_per_constraints_t *ct; + + static const long variants[] = { + -65536, -65535, -65534, -32769, -32768, -32767, -16385, -16384, + -16383, -257, -256, -255, -254, -129, -128, -127, + -126, -1, 0, 1, 126, 127, 128, 129, + 254, 255, 256, 257, 16383, 16384, 16385, 32767, + 32768, 32769, 65534, 65535, 65536, 65537}; + if(specs && specs->field_unsigned) { + assert(variants[18] == 0); + value = variants[asn_random_between( + 18, sizeof(variants) / sizeof(variants[0]) - 1)]; + } else { + value = variants[asn_random_between( + 0, sizeof(variants) / sizeof(variants[0]) - 1)]; + } + + if(!constraints) constraints = &td->encoding_constraints; + ct = constraints ? constraints->per_constraints : 0; + if(ct && (ct->value.flags & APC_CONSTRAINED)) { + if(value < ct->value.lower_bound || value > ct->value.upper_bound) { + value = asn_random_between(ct->value.lower_bound, + ct->value.upper_bound); + } + } + } + + if(asn_imax2INTEGER(st, value)) { + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + return result_failed; + } else { + *sptr = st; + result_ok.length = st->size; + return result_ok; + } +} diff --git a/src/codec_utils/E2SMKPM/INTEGER.h b/src/codec_utils/E2SMKPM/INTEGER.h new file mode 100644 index 000000000..f776c072e --- /dev/null +++ b/src/codec_utils/E2SMKPM/INTEGER.h @@ -0,0 +1,108 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _INTEGER_H_ +#define _INTEGER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; + +extern asn_TYPE_descriptor_t asn_DEF_INTEGER; +extern asn_TYPE_operation_t asn_OP_INTEGER; + +/* Map with to integer value association */ +typedef struct asn_INTEGER_enum_map_s { + long nat_value; /* associated native integer value */ + size_t enum_len; /* strlen("tag") */ + const char *enum_name; /* "tag" */ +} asn_INTEGER_enum_map_t; + +/* This type describes an enumeration for INTEGER and ENUMERATED types */ +typedef struct asn_INTEGER_specifics_s { + const asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */ + const unsigned int *enum2value; /* "tag" => N; sorted by tag */ + int map_count; /* Elements in either map */ + int extension; /* This map is extensible */ + int strict_enumeration; /* Enumeration set is fixed */ + int field_width; /* Size of native integer */ + int field_unsigned; /* Signed=0, unsigned=1 */ +} asn_INTEGER_specifics_t; + +#define INTEGER_free ASN__PRIMITIVE_TYPE_free +#define INTEGER_decode_ber ber_decode_primitive +#define INTEGER_constraint asn_generic_no_constraint +asn_struct_print_f INTEGER_print; +asn_struct_compare_f INTEGER_compare; +der_type_encoder_f INTEGER_encode_der; +xer_type_decoder_f INTEGER_decode_xer; +xer_type_encoder_f INTEGER_encode_xer; +oer_type_decoder_f INTEGER_decode_oer; +oer_type_encoder_f INTEGER_encode_oer; +per_type_decoder_f INTEGER_decode_uper; +per_type_encoder_f INTEGER_encode_uper; +per_type_decoder_f INTEGER_decode_aper; +per_type_encoder_f INTEGER_encode_aper; +asn_random_fill_f INTEGER_random_fill; + +/*********************************** + * Some handy conversion routines. * + ***********************************/ + +/* + * Natiwe size-independent conversion of native integers to/from INTEGER. + * (l_size) is in bytes. + * Returns 0 if it was possible to convert, -1 otherwise. + * -1/EINVAL: Mandatory argument missing + * -1/ERANGE: Value encoded is out of range for long representation + * -1/ENOMEM: Memory allocation failed (in asn_*2INTEGER()). + */ +int asn_INTEGER2imax(const INTEGER_t *i, intmax_t *l); +int asn_INTEGER2umax(const INTEGER_t *i, uintmax_t *l); +int asn_imax2INTEGER(INTEGER_t *i, intmax_t l); +int asn_umax2INTEGER(INTEGER_t *i, uintmax_t l); + +/* + * Size-specific conversion helpers. + */ +int asn_INTEGER2long(const INTEGER_t *i, long *l); +int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); +int asn_long2INTEGER(INTEGER_t *i, long l); +int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); +int asn_int642INTEGER(INTEGER_t *i, int64_t l); +int asn_uint642INTEGER(INTEGER_t *i, uint64_t l); + +/* A version of strtol/strtoimax(3) with nicer error reporting. */ +enum asn_strtox_result_e { + ASN_STRTOX_ERROR_RANGE = -3, /* Input outside of supported numeric range */ + ASN_STRTOX_ERROR_INVAL = -2, /* Invalid data encountered (e.g., "+-") */ + ASN_STRTOX_EXPECT_MORE = -1, /* More data expected (e.g. "+") */ + ASN_STRTOX_OK = 0, /* Conversion succeded, number ends at (*end) */ + ASN_STRTOX_EXTRA_DATA = 1 /* Conversion succeded, but the string has extra stuff */ +}; +enum asn_strtox_result_e asn_strtol_lim(const char *str, const char **end, + long *l); +enum asn_strtox_result_e asn_strtoul_lim(const char *str, const char **end, + unsigned long *l); +enum asn_strtox_result_e asn_strtoimax_lim(const char *str, const char **end, + intmax_t *l); +enum asn_strtox_result_e asn_strtoumax_lim(const char *str, const char **end, + uintmax_t *l); + +/* + * Convert the integer value into the corresponding enumeration map entry. + */ +const asn_INTEGER_enum_map_t *INTEGER_map_value2enum( + const asn_INTEGER_specifics_t *specs, long value); + +#ifdef __cplusplus +} +#endif + +#endif /* _INTEGER_H_ */ diff --git a/src/codec_utils/E2SMKPM/INTEGER_oer.c b/src/codec_utils/E2SMKPM/INTEGER_oer.c new file mode 100644 index 000000000..110689b2d --- /dev/null +++ b/src/codec_utils/E2SMKPM/INTEGER_oer.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +INTEGER_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **sptr, + const void *ptr, size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + INTEGER_t *st = (INTEGER_t *)*sptr; + struct asn_oer_constraint_number_s ct = {0, 0}; + size_t req_bytes; + + (void)opt_codec_ctx; + (void)specs; + + if(!st) { + st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints) ct = constraints->value; + + if(ct.width) { + req_bytes = ct.width; + } else { + /* No lower bound and no upper bound, effectively */ + + ssize_t consumed = oer_fetch_length(ptr, size, &req_bytes); + if(consumed == 0) { + ASN__DECODE_STARVED; + } else if(consumed == -1) { + ASN__DECODE_FAILED; + } + rval.consumed += consumed; + ptr = (const char *)ptr + consumed; + size -= consumed; + } + + if(req_bytes > size) { + ASN__DECODE_STARVED; + } + + if(ct.positive) { + /* X.969 08/2015 10.2(a) */ + unsigned msb; /* Most significant bit */ + size_t useful_size; + + /* Check most significant bit */ + msb = *(const uint8_t *)ptr >> 7; /* yields 0 or 1 */ + useful_size = msb + req_bytes; + st->buf = (uint8_t *)MALLOC(useful_size + 1); + if(!st->buf) { + ASN__DECODE_FAILED; + } + + /* + * Record a large unsigned in a way not to confuse it + * with signed value. + */ + st->buf[0] = '\0'; + memcpy(st->buf + msb, ptr, req_bytes); + st->buf[useful_size] = '\0'; /* Just in case, 0-terminate */ + st->size = useful_size; + + rval.consumed += req_bytes; + return rval; + } else { + /* X.969 08/2015 10.2(b) */ + st->buf = (uint8_t *)MALLOC(req_bytes + 1); + if(!st->buf) { + ASN__DECODE_FAILED; + } + + memcpy(st->buf, ptr, req_bytes); + st->buf[req_bytes] = '\0'; /* Just in case, 0-terminate */ + st->size = req_bytes; + + rval.consumed += req_bytes; + return rval; + } +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +INTEGER_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = sptr; + asn_enc_rval_t er = {0,0,0}; + struct asn_oer_constraint_number_s ct = {0, 0}; + const uint8_t *buf; + const uint8_t *end; + size_t useful_bytes; + size_t req_bytes = 0; + int sign = 0; + + if(!st || st->size == 0) ASN__ENCODE_FAILED; + + if(!constraints) constraints = td->encoding_constraints.oer_constraints; + if(constraints) ct = constraints->value; + + er.encoded = 0; + + buf = st->buf; + end = buf + st->size; + + sign = (buf && buf < end) ? buf[0] & 0x80 : 0; + + /* Ignore 9 leading zeroes or ones */ + if(ct.positive) { + if(sign) { + /* The value given is a signed value. Can't proceed. */ + ASN__ENCODE_FAILED; + } + /* Remove leading zeros. */ + for(; buf + 1 < end; buf++) { + if(buf[0] != 0x0) break; + } + } else { + for(; buf + 1 < end; buf++) { + if(buf[0] == 0x0 && (buf[1] & 0x80) == 0) { + continue; + } else if(buf[0] == 0xff && (buf[1] & 0x80) != 0) { + continue; + } + break; + } + } + + useful_bytes = end - buf; + if(ct.width) { + req_bytes = ct.width; + } else { + ssize_t r = oer_serialize_length(useful_bytes, cb, app_key); + if(r < 0) { + ASN__ENCODE_FAILED; + } + er.encoded += r; + req_bytes = useful_bytes; + } + + if(req_bytes < useful_bytes) { + ASN__ENCODE_FAILED; + } + + er.encoded += req_bytes; + + for(; req_bytes > useful_bytes; req_bytes--) { + if(cb(sign?"\xff":"\0", 1, app_key) < 0) { + ASN__ENCODE_FAILED; + } + } + + if(cb(buf, useful_bytes, app_key) < 0) { + ASN__ENCODE_FAILED; + } + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/Makefile.am.libasncodec b/src/codec_utils/E2SMKPM/Makefile.am.libasncodec new file mode 100644 index 000000000..9812867ba --- /dev/null +++ b/src/codec_utils/E2SMKPM/Makefile.am.libasncodec @@ -0,0 +1,214 @@ +ASN_MODULE_SRCS= \ + ./codeathon/e2smkpm/GlobalKPMnode-ID.c \ + ./codeathon/e2smkpm/GlobalKPMnode-gNB-ID.c \ + ./codeathon/e2smkpm/GlobalgNB-ID.c \ + ./codeathon/e2smkpm/GNB-CU-UP-ID.c \ + ./codeathon/e2smkpm/GNB-DU-ID.c \ + ./codeathon/e2smkpm/GNB-ID-Choice.c \ + ./codeathon/e2smkpm/GlobalKPMnode-en-gNB-ID.c \ + ./codeathon/e2smkpm/GlobalenGNB-ID.c \ + ./codeathon/e2smkpm/ENGNB-ID.c \ + ./codeathon/e2smkpm/GlobalKPMnode-ng-eNB-ID.c \ + ./codeathon/e2smkpm/GlobalngeNB-ID.c \ + ./codeathon/e2smkpm/ENB-ID-Choice.c \ + ./codeathon/e2smkpm/GlobalKPMnode-eNB-ID.c \ + ./codeathon/e2smkpm/GlobalENB-ID.c \ + ./codeathon/e2smkpm/ENB-ID.c \ + ./codeathon/e2smkpm/NRCGI.c \ + ./codeathon/e2smkpm/PLMN-Identity.c \ + ./codeathon/e2smkpm/NRCellIdentity.c \ + ./codeathon/e2smkpm/SNSSAI.c \ + ./codeathon/e2smkpm/RIC-Style-Type.c \ + ./codeathon/e2smkpm/RIC-Style-Name.c \ + ./codeathon/e2smkpm/RIC-Format-Type.c \ + ./codeathon/e2smkpm/E2SM-KPM-EventTriggerDefinition.c \ + ./codeathon/e2smkpm/E2SM-KPM-EventTriggerDefinition-Format1.c \ + ./codeathon/e2smkpm/E2SM-KPM-ActionDefinition.c \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationHeader.c \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationHeader-Format1.c \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationMessage.c \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationMessage-Format1.c \ + ./codeathon/e2smkpm/PM-Containers-List.c \ + ./codeathon/e2smkpm/E2SM-KPM-RANfunction-Description.c \ + ./codeathon/e2smkpm/NI-Type.c \ + ./codeathon/e2smkpm/RAN-Container.c \ + ./codeathon/e2smkpm/Trigger-ConditionIE-Item.c \ + ./codeathon/e2smkpm/RT-Period-IE.c \ + ./codeathon/e2smkpm/RANcallProcess-ID-string.c \ + ./codeathon/e2smkpm/RANfunction-Name.c \ + ./codeathon/e2smkpm/RIC-EventTriggerStyle-List.c \ + ./codeathon/e2smkpm/RIC-ReportStyle-List.c \ + ./codeathon/e2smkpm/PF-Container.c \ + ./codeathon/e2smkpm/GNB-CU-CP-Name.c \ + ./codeathon/e2smkpm/GNB-DU-Name.c \ + ./codeathon/e2smkpm/GNB-CU-UP-Name.c \ + ./codeathon/e2smkpm/ODU-PF-Container.c \ + ./codeathon/e2smkpm/CellResourceReportListItem.c \ + ./codeathon/e2smkpm/ServedPlmnPerCellListItem.c \ + ./codeathon/e2smkpm/FGC-DU-PM-Container.c \ + ./codeathon/e2smkpm/SlicePerPlmnPerCellListItem.c \ + ./codeathon/e2smkpm/FQIPERSlicesPerPlmnPerCellListItem.c \ + ./codeathon/e2smkpm/EPC-DU-PM-Container.c \ + ./codeathon/e2smkpm/PerQCIReportListItem.c \ + ./codeathon/e2smkpm/OCUCP-PF-Container.c \ + ./codeathon/e2smkpm/OCUUP-PF-Container.c \ + ./codeathon/e2smkpm/PF-ContainerListItem.c \ + ./codeathon/e2smkpm/CUUPMeasurement-Container.c \ + ./codeathon/e2smkpm/PlmnID-List.c \ + ./codeathon/e2smkpm/FGC-CUUP-PM-Format.c \ + ./codeathon/e2smkpm/SliceToReportListItem.c \ + ./codeathon/e2smkpm/FQIPERSlicesPerPlmnListItem.c \ + ./codeathon/e2smkpm/EPC-CUUP-PM-Format.c \ + ./codeathon/e2smkpm/PerQCIReportListItemFormat.c + +ASN_MODULE_HDRS= \ + ./codeathon/e2smkpm/GlobalKPMnode-ID.h \ + ./codeathon/e2smkpm/GlobalKPMnode-gNB-ID.h \ + ./codeathon/e2smkpm/GlobalgNB-ID.h \ + ./codeathon/e2smkpm/GNB-CU-UP-ID.h \ + ./codeathon/e2smkpm/GNB-DU-ID.h \ + ./codeathon/e2smkpm/GNB-ID-Choice.h \ + ./codeathon/e2smkpm/GlobalKPMnode-en-gNB-ID.h \ + ./codeathon/e2smkpm/GlobalenGNB-ID.h \ + ./codeathon/e2smkpm/ENGNB-ID.h \ + ./codeathon/e2smkpm/GlobalKPMnode-ng-eNB-ID.h \ + ./codeathon/e2smkpm/GlobalngeNB-ID.h \ + ./codeathon/e2smkpm/ENB-ID-Choice.h \ + ./codeathon/e2smkpm/GlobalKPMnode-eNB-ID.h \ + ./codeathon/e2smkpm/GlobalENB-ID.h \ + ./codeathon/e2smkpm/ENB-ID.h \ + ./codeathon/e2smkpm/NRCGI.h \ + ./codeathon/e2smkpm/PLMN-Identity.h \ + ./codeathon/e2smkpm/NRCellIdentity.h \ + ./codeathon/e2smkpm/SNSSAI.h \ + ./codeathon/e2smkpm/RIC-Style-Type.h \ + ./codeathon/e2smkpm/RIC-Style-Name.h \ + ./codeathon/e2smkpm/RIC-Format-Type.h \ + ./codeathon/e2smkpm/E2SM-KPM-EventTriggerDefinition.h \ + ./codeathon/e2smkpm/E2SM-KPM-EventTriggerDefinition-Format1.h \ + ./codeathon/e2smkpm/E2SM-KPM-ActionDefinition.h \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationHeader.h \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationHeader-Format1.h \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationMessage.h \ + ./codeathon/e2smkpm/E2SM-KPM-IndicationMessage-Format1.h \ + ./codeathon/e2smkpm/PM-Containers-List.h \ + ./codeathon/e2smkpm/E2SM-KPM-RANfunction-Description.h \ + ./codeathon/e2smkpm/NI-Type.h \ + ./codeathon/e2smkpm/RAN-Container.h \ + ./codeathon/e2smkpm/Trigger-ConditionIE-Item.h \ + ./codeathon/e2smkpm/RT-Period-IE.h \ + ./codeathon/e2smkpm/RANcallProcess-ID-string.h \ + ./codeathon/e2smkpm/RANfunction-Name.h \ + ./codeathon/e2smkpm/RIC-EventTriggerStyle-List.h \ + ./codeathon/e2smkpm/RIC-ReportStyle-List.h \ + ./codeathon/e2smkpm/PF-Container.h \ + ./codeathon/e2smkpm/GNB-CU-CP-Name.h \ + ./codeathon/e2smkpm/GNB-DU-Name.h \ + ./codeathon/e2smkpm/GNB-CU-UP-Name.h \ + ./codeathon/e2smkpm/ODU-PF-Container.h \ + ./codeathon/e2smkpm/CellResourceReportListItem.h \ + ./codeathon/e2smkpm/ServedPlmnPerCellListItem.h \ + ./codeathon/e2smkpm/FGC-DU-PM-Container.h \ + ./codeathon/e2smkpm/SlicePerPlmnPerCellListItem.h \ + ./codeathon/e2smkpm/FQIPERSlicesPerPlmnPerCellListItem.h \ + ./codeathon/e2smkpm/EPC-DU-PM-Container.h \ + ./codeathon/e2smkpm/PerQCIReportListItem.h \ + ./codeathon/e2smkpm/OCUCP-PF-Container.h \ + ./codeathon/e2smkpm/OCUUP-PF-Container.h \ + ./codeathon/e2smkpm/PF-ContainerListItem.h \ + ./codeathon/e2smkpm/CUUPMeasurement-Container.h \ + ./codeathon/e2smkpm/PlmnID-List.h \ + ./codeathon/e2smkpm/FGC-CUUP-PM-Format.h \ + ./codeathon/e2smkpm/SliceToReportListItem.h \ + ./codeathon/e2smkpm/FQIPERSlicesPerPlmnListItem.h \ + ./codeathon/e2smkpm/EPC-CUUP-PM-Format.h \ + ./codeathon/e2smkpm/PerQCIReportListItemFormat.h + +ASN_MODULE_HDRS+=./codeathon/e2smkpm/OPEN_TYPE.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/OPEN_TYPE.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constr_CHOICE.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/INTEGER.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/INTEGER.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/NativeEnumerated.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/NativeEnumerated.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/NativeInteger.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/NativeInteger.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/PrintableString.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/PrintableString.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/OCTET_STRING.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_SET_OF.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_SET_OF.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_CHOICE.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constr_SEQUENCE.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_SEQUENCE.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constr_SET_OF.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_SET_OF.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_application.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_application.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_ioc.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_system.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_codecs.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_internal.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_internal.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_random_fill.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_random_fill.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_bit_data.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_bit_data.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/OCTET_STRING.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/BIT_STRING.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/BIT_STRING.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/asn_codecs_prim.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/asn_codecs_prim.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/ber_tlv_length.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/ber_tlv_length.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/ber_tlv_tag.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/ber_tlv_tag.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/ber_decoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/ber_decoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/der_encoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/der_encoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constr_TYPE.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_TYPE.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/constraints.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constraints.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/xer_support.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/xer_support.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/xer_decoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/xer_decoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/xer_encoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/xer_encoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/per_support.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/per_support.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/per_decoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/per_decoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/per_encoder.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/per_encoder.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/per_opentype.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/per_opentype.c +ASN_MODULE_HDRS+=./codeathon/e2smkpm/oer_decoder.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/oer_encoder.h +ASN_MODULE_HDRS+=./codeathon/e2smkpm/oer_support.h +ASN_MODULE_SRCS+=./codeathon/e2smkpm/oer_decoder.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/oer_encoder.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/oer_support.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/INTEGER_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/BIT_STRING_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/OCTET_STRING_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/NativeInteger_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/NativeEnumerated_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_CHOICE_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=./codeathon/e2smkpm/constr_SET_OF_oer.c + +ASN_MODULE_CFLAGS= + +lib_LTLIBRARIES+=libasncodec.la +libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/./codeathon/e2smkpm/ +libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) +libasncodec_la_LDFLAGS=-lm diff --git a/src/codec_utils/E2SMKPM/NI-Type.c b/src/codec_utils/E2SMKPM/NI-Type.c new file mode 100644 index 000000000..79d2da81d --- /dev/null +++ b/src/codec_utils/E2SMKPM/NI-Type.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "NI-Type.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_NI_Type_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_NI_Type_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_NI_Type_value2enum_1[] = { + { 0, 4, "x2-u" }, + { 1, 4, "xn-u" }, + { 2, 4, "f1-u" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_NI_Type_enum2value_1[] = { + 2, /* f1-u(2) */ + 0, /* x2-u(0) */ + 1 /* xn-u(1) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_NI_Type_specs_1 = { + asn_MAP_NI_Type_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_NI_Type_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_NI_Type_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NI_Type = { + "NI-Type", + "NI-Type", + &asn_OP_NativeEnumerated, + asn_DEF_NI_Type_tags_1, + sizeof(asn_DEF_NI_Type_tags_1) + /sizeof(asn_DEF_NI_Type_tags_1[0]), /* 1 */ + asn_DEF_NI_Type_tags_1, /* Same as above */ + sizeof(asn_DEF_NI_Type_tags_1) + /sizeof(asn_DEF_NI_Type_tags_1[0]), /* 1 */ + { &asn_OER_type_NI_Type_constr_1, &asn_PER_type_NI_Type_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_NI_Type_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/NI-Type.h b/src/codec_utils/E2SMKPM/NI-Type.h new file mode 100644 index 000000000..fba3a1321 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NI-Type.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _NI_Type_H_ +#define _NI_Type_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum NI_Type { + NI_Type_x2_u = 0, + NI_Type_xn_u = 1, + NI_Type_f1_u = 2 + /* + * Enumeration is extensible + */ +} e_NI_Type; + +/* NI-Type */ +typedef long NI_Type_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_NI_Type_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_NI_Type; +extern const asn_INTEGER_specifics_t asn_SPC_NI_Type_specs_1; +asn_struct_free_f NI_Type_free; +asn_struct_print_f NI_Type_print; +asn_constr_check_f NI_Type_constraint; +ber_type_decoder_f NI_Type_decode_ber; +der_type_encoder_f NI_Type_encode_der; +xer_type_decoder_f NI_Type_decode_xer; +xer_type_encoder_f NI_Type_encode_xer; +oer_type_decoder_f NI_Type_decode_oer; +oer_type_encoder_f NI_Type_encode_oer; +per_type_decoder_f NI_Type_decode_uper; +per_type_encoder_f NI_Type_encode_uper; +per_type_decoder_f NI_Type_decode_aper; +per_type_encoder_f NI_Type_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _NI_Type_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/NRCGI.c b/src/codec_utils/E2SMKPM/NRCGI.c new file mode 100644 index 000000000..aa4260702 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NRCGI.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "NRCGI.h" + +asn_TYPE_member_t asn_MBR_NRCGI_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct NRCGI, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct NRCGI, nRCellIdentity), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NRCellIdentity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "nRCellIdentity" + }, +}; +static const ber_tlv_tag_t asn_DEF_NRCGI_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_NRCGI_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* nRCellIdentity */ +}; +asn_SEQUENCE_specifics_t asn_SPC_NRCGI_specs_1 = { + sizeof(struct NRCGI), + offsetof(struct NRCGI, _asn_ctx), + asn_MAP_NRCGI_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_NRCGI = { + "NRCGI", + "NRCGI", + &asn_OP_SEQUENCE, + asn_DEF_NRCGI_tags_1, + sizeof(asn_DEF_NRCGI_tags_1) + /sizeof(asn_DEF_NRCGI_tags_1[0]), /* 1 */ + asn_DEF_NRCGI_tags_1, /* Same as above */ + sizeof(asn_DEF_NRCGI_tags_1) + /sizeof(asn_DEF_NRCGI_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_NRCGI_1, + 2, /* Elements count */ + &asn_SPC_NRCGI_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/NRCGI.h b/src/codec_utils/E2SMKPM/NRCGI.h new file mode 100644 index 000000000..5cfab4eba --- /dev/null +++ b/src/codec_utils/E2SMKPM/NRCGI.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _NRCGI_H_ +#define _NRCGI_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include "NRCellIdentity.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* NRCGI */ +typedef struct NRCGI { + PLMN_Identity_t pLMN_Identity; + NRCellIdentity_t nRCellIdentity; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} NRCGI_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_NRCGI; +extern asn_SEQUENCE_specifics_t asn_SPC_NRCGI_specs_1; +extern asn_TYPE_member_t asn_MBR_NRCGI_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _NRCGI_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/NRCellIdentity.c b/src/codec_utils/E2SMKPM/NRCellIdentity.c new file mode 100644 index 000000000..68386111c --- /dev/null +++ b/src/codec_utils/E2SMKPM/NRCellIdentity.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "NRCellIdentity.h" + +int +NRCellIdentity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 36)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using BIT_STRING, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_NRCellIdentity_constr_1 CC_NOTUSED = { + { 0, 0 }, + 36 /* (SIZE(36..36)) */}; +asn_per_constraints_t asn_PER_type_NRCellIdentity_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 36, 36 } /* (SIZE(36..36)) */, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_NRCellIdentity_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NRCellIdentity = { + "NRCellIdentity", + "NRCellIdentity", + &asn_OP_BIT_STRING, + asn_DEF_NRCellIdentity_tags_1, + sizeof(asn_DEF_NRCellIdentity_tags_1) + /sizeof(asn_DEF_NRCellIdentity_tags_1[0]), /* 1 */ + asn_DEF_NRCellIdentity_tags_1, /* Same as above */ + sizeof(asn_DEF_NRCellIdentity_tags_1) + /sizeof(asn_DEF_NRCellIdentity_tags_1[0]), /* 1 */ + { &asn_OER_type_NRCellIdentity_constr_1, &asn_PER_type_NRCellIdentity_constr_1, NRCellIdentity_constraint }, + 0, 0, /* No members */ + &asn_SPC_BIT_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/NRCellIdentity.h b/src/codec_utils/E2SMKPM/NRCellIdentity.h new file mode 100644 index 000000000..f94055bd8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NRCellIdentity.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _NRCellIdentity_H_ +#define _NRCellIdentity_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* NRCellIdentity */ +typedef BIT_STRING_t NRCellIdentity_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_NRCellIdentity_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_NRCellIdentity; +asn_struct_free_f NRCellIdentity_free; +asn_struct_print_f NRCellIdentity_print; +asn_constr_check_f NRCellIdentity_constraint; +ber_type_decoder_f NRCellIdentity_decode_ber; +der_type_encoder_f NRCellIdentity_encode_der; +xer_type_decoder_f NRCellIdentity_decode_xer; +xer_type_encoder_f NRCellIdentity_encode_xer; +oer_type_decoder_f NRCellIdentity_decode_oer; +oer_type_encoder_f NRCellIdentity_encode_oer; +per_type_decoder_f NRCellIdentity_decode_uper; +per_type_encoder_f NRCellIdentity_encode_uper; +per_type_decoder_f NRCellIdentity_decode_aper; +per_type_encoder_f NRCellIdentity_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _NRCellIdentity_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/NativeEnumerated.c b/src/codec_utils/E2SMKPM/NativeEnumerated.c new file mode 100644 index 000000000..50ffb1d78 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeEnumerated.c @@ -0,0 +1,367 @@ +/*- + * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeEnumerated basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeEnumerated = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeEnumerated_decode_oer, + NativeEnumerated_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, + NativeEnumerated_decode_aper, + NativeEnumerated_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeEnumerated_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { + "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + "ENUMERATED", + &asn_OP_NativeEnumerated, + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +asn_enc_rval_t +NativeEnumerated_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + const asn_INTEGER_enum_map_t *el; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + el = INTEGER_map_value2enum(specs, *native); + if(el) { + er.encoded = + asn__format_to_callback(cb, app_key, "<%s/>", el->enum_name); + if(er.encoded < 0) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } else { + ASN_DEBUG( + "ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +NativeEnumerated_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +static int +NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { + const asn_INTEGER_enum_map_t *a = ap; + const asn_INTEGER_enum_map_t *b = bp; + if(a->nat_value == b->nat_value) + return 0; + if(a->nat_value < b->nat_value) + return -1; + return 1; +} + +asn_enc_rval_t +NativeEnumerated_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + const asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +NativeEnumerated_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + /* Deal with APER padding */ + if(ct && ct->upper_bound >= 255) { + int padding = 0; + padding = (8 - (pd->moved % 8)) % 8; + ASN_DEBUG("For NativeEnumerated %s,offset= %lu Padding bits = %d", td->name, pd->moved, padding); + ASN_DEBUG("For NativeEnumerated %s, upper bound = %lu", td->name, ct->upper_bound); + if(padding > 0) + per_get_few_bits(pd, padding); + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +asn_enc_rval_t +NativeEnumerated_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + if(native < 0) ASN__ENCODE_FAILED; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/src/codec_utils/E2SMKPM/NativeEnumerated.h b/src/codec_utils/E2SMKPM/NativeEnumerated.h new file mode 100644 index 000000000..459f0e633 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeEnumerated.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard ENUMERATED in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeEnumerated_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeEnumerated_H_ +#define _NativeEnumerated_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; +extern asn_TYPE_operation_t asn_OP_NativeEnumerated; + +xer_type_encoder_f NativeEnumerated_encode_xer; +oer_type_decoder_f NativeEnumerated_decode_oer; +oer_type_encoder_f NativeEnumerated_encode_oer; +per_type_decoder_f NativeEnumerated_decode_uper; +per_type_encoder_f NativeEnumerated_encode_uper; +per_type_decoder_f NativeEnumerated_decode_aper; +per_type_encoder_f NativeEnumerated_encode_aper; + +#define NativeEnumerated_free NativeInteger_free +#define NativeEnumerated_print NativeInteger_print +#define NativeEnumerated_compare NativeInteger_compare +#define NativeEnumerated_random_fill NativeInteger_random_fill +#define NativeEnumerated_constraint asn_generic_no_constraint +#define NativeEnumerated_decode_ber NativeInteger_decode_ber +#define NativeEnumerated_encode_der NativeInteger_encode_der +#define NativeEnumerated_decode_xer NativeInteger_decode_xer + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeEnumerated_H_ */ diff --git a/src/codec_utils/E2SMKPM/NativeEnumerated_oer.c b/src/codec_utils/E2SMKPM/NativeEnumerated_oer.c new file mode 100644 index 000000000..ee3c1895e --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeEnumerated_oer.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +static long +asn__nativeenumerated_convert(const uint8_t *b, const uint8_t *end) { + unsigned long value; + + /* Perform the sign initialization */ + /* Actually value = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) { + value = (unsigned long)(-1); + } else { + value = 0; + } + + /* Conversion engine */ + for(; b < end; b++) { + value = (value << 8) | *b; + } + + return value; +} + +asn_dec_rval_t +NativeEnumerated_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + const uint8_t *b = ptr; + + (void)opt_codec_ctx; + (void)constraints; + + if(size < 1) { + ASN__DECODE_STARVED; + } + + if((*b & 0x80) == 0) { + /* + * X.696 (08/2015) #11.2 Short form for Enumerated. + */ + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = *b; + rval.consumed = 1; + } else { + /* + * X.696 (08/2015) #11.4 Long form for Enumerated. + */ + size_t length = *b & 0x7f; + const uint8_t *bend; + long value; + + if(length < 1 || length > sizeof(*native)) { + ASN__DECODE_FAILED; + } + if((1 + length) > size) { + ASN__DECODE_STARVED; + } + b++; + bend = b + length; + + value = asn__nativeenumerated_convert(b, bend); + if(value < 0) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + ASN__DECODE_FAILED; + } + } + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = value; + + rval.consumed = (1 + length); + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeEnumerated_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + long native; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + if(native >= 0 && native <= 127) { + /* #11.2 Short form */ + uint8_t b = native; + er.encoded = 1; + if(cb(&b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } else { + /* #11.2 Long form */ + uint8_t buf[1 + sizeof(native)]; + uint8_t *b = &buf[sizeof(native)]; /* Last addressable */ + long final_pattern = -1 * (native < 0); + + for(;;) { + *b-- = native; + native >>= 8; + if(native == final_pattern) { + if(final_pattern) { + if((b[1] & 0x80)) break; + } else { + if(!(b[1] & 0x80)) break; + } + } + } + *b = 0x80 | (&buf[sizeof(native)] - b); + er.encoded = 1 + (&buf[sizeof(native)] - b); + if(cb(b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/NativeInteger.c b/src/codec_utils/E2SMKPM/NativeInteger.c new file mode 100644 index 000000000..316e8720a --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeInteger.c @@ -0,0 +1,550 @@ +/*- + * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeInteger basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeInteger = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeInteger_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeInteger_decode_oer, /* OER decoder */ + NativeInteger_encode_oer, /* Canonical OER encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ + NativeInteger_decode_aper, /* Aligned PER decoder */ + NativeInteger_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeInteger_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeInteger = { + "INTEGER", /* The ASN.1 type is still INTEGER */ + "INTEGER", + &asn_OP_NativeInteger, + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Decode INTEGER type. + */ +asn_dec_rval_t +NativeInteger_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **nint_ptr, + const void *buf_ptr, size_t size, int tag_mode) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + long *native = (long *)*nint_ptr; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(native == NULL) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(native == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded INTEGER: buf_ptr, length + * Fill the native, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + long l; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; + tmp.size = length; + + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *native = l; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", + (long)rval.consumed, (long)length, td->name, (long)*native); + + return rval; +} + +/* + * Encode the NativeInteger using the standard INTEGER type DER encoder. + */ +asn_enc_rval_t +NativeInteger_encode_der(const asn_TYPE_descriptor_t *sd, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned long native = *(const unsigned long *)ptr; /* Disable sign ext. */ + asn_enc_rval_t erval = {0,0,0}; + INTEGER_t tmp; + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + + tmp.buf = (uint8_t *)&native; + tmp.size = sizeof(native); + +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ + uint8_t buf[sizeof(native)]; + uint8_t *p; + + /* Prepare a fake INTEGER */ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) + *p = (uint8_t)native; + + tmp.buf = buf; + tmp.size = sizeof(buf); +#endif /* WORDS_BIGENDIAN */ + + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.structure_ptr == &tmp) { + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +asn_dec_rval_t +NativeInteger_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + INTEGER_t st; + void *st_ptr = (void *)&st; + long *native = (long *)*sptr; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&st, 0, sizeof(st)); + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + opt_mname, buf_ptr, size); + if(rval.code == RC_OK) { + long l; + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&st, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&st, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } else { + *native = l; + } + } else { + /* + * Cannot restart from the middle; + * there is no place to save state in the native type. + * Request a continuation from the very beginning. + */ + rval.consumed = 0; + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); + return rval; +} + + +asn_enc_rval_t +NativeInteger_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; /* Enough for 64-bit int */ + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + er.encoded = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); + if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) + || cb(scratch, er.encoded, app_key) < 0) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +NativeInteger_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_uper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +asn_dec_rval_t +NativeInteger_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (APER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_aper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (APER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, (unsigned long)native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_aper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +/* + * INTEGER specific human-readable output. + */ +int +NativeInteger_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + const long *native = (const long *)sptr; + char scratch[32]; /* Enough for 64-bit int */ + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(native) { + long value = *native; + ret = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) ? "%lu" : "%ld", value); + assert(ret > 0 && (size_t)ret < sizeof(scratch)); + if(cb(scratch, ret, app_key) < 0) return -1; + if(specs && (value >= 0 || !specs->field_unsigned)) { + const asn_INTEGER_enum_map_t *el = + INTEGER_map_value2enum(specs, value); + if(el) { + if(cb(" (", 2, app_key) < 0) return -1; + if(cb(el->enum_name, el->enum_len, app_key) < 0) return -1; + if(cb(")", 1, app_key) < 0) return -1; + } + } + return 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +NativeInteger_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", + td->name, method, ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, sizeof(long)); + break; + } +} + +int +NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + (void)td; + + if(aptr && bptr) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + const unsigned long *a = aptr; + const unsigned long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } else { + const long *a = aptr; + const long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } + } else if(!aptr) { + return -1; + } else { + return 1; + } +} + +asn_random_fill_result_t +NativeInteger_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + long *st = *sptr; + const asn_INTEGER_enum_map_t *emap; + size_t emap_len; + intmax_t value; + int find_inside_map; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (long *)CALLOC(1, sizeof(*st)); + if(st == NULL) { + return result_failed; + } + } + + if(specs) { + emap = specs->value2enum; + emap_len = specs->map_count; + if(specs->strict_enumeration) { + find_inside_map = emap_len > 0; + } else { + find_inside_map = emap_len ? asn_random_between(0, 1) : 0; + } + } else { + emap = 0; + emap_len = 0; + find_inside_map = 0; + } + + if(find_inside_map) { + assert(emap_len > 0); + value = emap[asn_random_between(0, emap_len - 1)].nat_value; + } else { + const asn_per_constraints_t *ct; + + static const long variants[] = { + -65536, -65535, -65534, -32769, -32768, -32767, -16385, -16384, + -16383, -257, -256, -255, -254, -129, -128, -127, + -126, -1, 0, 1, 126, 127, 128, 129, + 254, 255, 256, 257, 16383, 16384, 16385, 32767, + 32768, 32769, 65534, 65535, 65536, 65537}; + if(specs && specs->field_unsigned) { + assert(variants[18] == 0); + value = variants[asn_random_between( + 18, sizeof(variants) / sizeof(variants[0]) - 1)]; + } else { + value = variants[asn_random_between( + 0, sizeof(variants) / sizeof(variants[0]) - 1)]; + } + + if(!constraints) constraints = &td->encoding_constraints; + ct = constraints ? constraints->per_constraints : 0; + if(ct && (ct->value.flags & APC_CONSTRAINED)) { + if(value < ct->value.lower_bound || value > ct->value.upper_bound) { + value = asn_random_between(ct->value.lower_bound, + ct->value.upper_bound); + } + } + } + + *sptr = st; + *st = value; + return result_ok; +} diff --git a/src/codec_utils/E2SMKPM/NativeInteger.h b/src/codec_utils/E2SMKPM/NativeInteger.h new file mode 100644 index 000000000..c74406a8a --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeInteger.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard INTEGER in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeInteger_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeInteger_H_ +#define _NativeInteger_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; +extern asn_TYPE_operation_t asn_OP_NativeInteger; + +asn_struct_free_f NativeInteger_free; +asn_struct_print_f NativeInteger_print; +asn_struct_compare_f NativeInteger_compare; +ber_type_decoder_f NativeInteger_decode_ber; +der_type_encoder_f NativeInteger_encode_der; +xer_type_decoder_f NativeInteger_decode_xer; +xer_type_encoder_f NativeInteger_encode_xer; +oer_type_decoder_f NativeInteger_decode_oer; +oer_type_encoder_f NativeInteger_encode_oer; +per_type_decoder_f NativeInteger_decode_uper; +per_type_encoder_f NativeInteger_encode_uper; +per_type_decoder_f NativeInteger_decode_aper; +per_type_encoder_f NativeInteger_encode_aper; +asn_random_fill_f NativeInteger_random_fill; + +#define NativeInteger_constraint asn_generic_no_constraint + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeInteger_H_ */ diff --git a/src/codec_utils/E2SMKPM/NativeInteger_oer.c b/src/codec_utils/E2SMKPM/NativeInteger_oer.c new file mode 100644 index 000000000..411413a24 --- /dev/null +++ b/src/codec_utils/E2SMKPM/NativeInteger_oer.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +NativeInteger_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + INTEGER_t tmpint; + INTEGER_t *tmpintptr = &tmpint; + + memset(&tmpint, 0, sizeof(tmpint)); + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + /* + * OPTIMIZATION: Encode directly rather than passing through INTEGER. + * Saves a memory allocation. + */ + rval = INTEGER_decode_oer(opt_codec_ctx, td, constraints, + (void **)&tmpintptr, ptr, size); + if(rval.code != RC_OK) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return rval; + } + + if(specs && specs->field_unsigned) { + unsigned long ul; + int ok = asn_INTEGER2ulong(&tmpint, &ul) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = ul; + } else { + rval.code = RC_FAIL; + return rval; + } + } else { + long l; + int ok = asn_INTEGER2long(&tmpint, &l) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = l; + } else { + rval.code = RC_FAIL; + return rval; + } + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeInteger_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + INTEGER_t tmpint; + long native; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + memset(&tmpint, 0, sizeof(tmpint)); + + ASN_DEBUG("Encoding %s %ld as NativeInteger", td ? td->name : "", native); + + if((specs && specs->field_unsigned) ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t er = + INTEGER_encode_oer(td, constraints, &tmpint, cb, app_key); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/OCTET_STRING.c b/src/codec_utils/E2SMKPM/OCTET_STRING.c new file mode 100644 index 000000000..ae34c9681 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCTET_STRING.c @@ -0,0 +1,2411 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ +#include + +/* + * OCTET STRING basic type description. + */ +static const ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs = { + sizeof(OCTET_STRING_t), + offsetof(OCTET_STRING_t, _asn_ctx), + ASN_OSUBV_STR +}; + +asn_TYPE_operation_t asn_OP_OCTET_STRING = { + OCTET_STRING_free, + OCTET_STRING_print, /* OCTET STRING generally means a non-ascii sequence */ + OCTET_STRING_compare, + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ + OCTET_STRING_decode_aper, /* Aligned PER decoder */ + OCTET_STRING_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + OCTET_STRING_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { + "OCTET STRING", /* Canonical name */ + "OCTET_STRING", /* XML tag name */ + &asn_OP_OCTET_STRING, + asn_DEF_OCTET_STRING_tags, + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), + asn_DEF_OCTET_STRING_tags, /* Same as above */ + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs +}; + +#undef _CH_PHASE +#undef NEXT_PHASE +#undef PREV_PHASE +#define _CH_PHASE(ctx, inc) do { \ + if(ctx->phase == 0) \ + ctx->context = 0; \ + ctx->phase += inc; \ + } while(0) +#define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) +#define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +#undef APPEND +#define APPEND(bufptr, bufsize) do { \ + size_t _bs = (bufsize); /* Append size */ \ + size_t _ns = ctx->context; /* Allocated now */ \ + size_t _es = st->size + _bs; /* Expected size */ \ + /* int is really a typeof(st->size): */ \ + if((int)_es < 0) RETURN(RC_FAIL); \ + if(_ns <= _es) { \ + void *ptr; \ + /* Be nice and round to the memory allocator */ \ + do { _ns = _ns ? _ns << 1 : 16; } \ + while(_ns <= _es); \ + /* int is really a typeof(st->size): */ \ + if((int)_ns < 0) RETURN(RC_FAIL); \ + ptr = REALLOC(st->buf, _ns); \ + if(ptr) { \ + st->buf = (uint8_t *)ptr; \ + ctx->context = _ns; \ + } else { \ + RETURN(RC_FAIL); \ + } \ + ASN_DEBUG("Reallocating into %ld", (long)_ns); \ + } \ + memcpy(st->buf + st->size, bufptr, _bs); \ + /* Convenient nul-termination */ \ + st->buf[_es] = '\0'; \ + st->size = _es; \ + } while(0) + +/* + * The main reason why ASN.1 is still alive is that too much time and effort + * is necessary for learning it more or less adequately, thus creating a gut + * necessity to demonstrate that aquired skill everywhere afterwards. + * No, I am not going to explain what the following stuff is. + */ +struct _stack_el { + ber_tlv_len_t left; /* What's left to read (or -1) */ + ber_tlv_len_t got; /* What was actually processed */ + unsigned cont_level; /* Depth of subcontainment */ + int want_nulls; /* Want null "end of content" octets? */ + int bits_chopped; /* Flag in BIT STRING mode */ + ber_tlv_tag_t tag; /* For debugging purposes */ + struct _stack_el *prev; + struct _stack_el *next; +}; +struct _stack { + struct _stack_el *tail; + struct _stack_el *cur_ptr; +}; + +static struct _stack_el * +OS__add_stack_el(struct _stack *st) { + struct _stack_el *nel; + + /* + * Reuse the old stack frame or allocate a new one. + */ + if(st->cur_ptr && st->cur_ptr->next) { + nel = st->cur_ptr->next; + nel->bits_chopped = 0; + nel->got = 0; + /* Retain the nel->cont_level, it's correct. */ + } else { + nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); + if(nel == NULL) + return NULL; + + if(st->tail) { + /* Increase a subcontainment depth */ + nel->cont_level = st->tail->cont_level + 1; + st->tail->next = nel; + } + nel->prev = st->tail; + st->tail = nel; + } + + st->cur_ptr = nel; + + return nel; +} + +static struct _stack * +_new_stack(void) { + return (struct _stack *)CALLOC(1, sizeof(struct _stack)); +} + +/* + * Decode OCTET STRING type. + */ +asn_dec_rval_t +OCTET_STRING_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const void *buf_ptr, size_t size, int tag_mode) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + asn_dec_rval_t rval; + asn_struct_ctx_t *ctx; + ssize_t consumed_myself = 0; + struct _stack *stck; /* Expectations stack structure */ + struct _stack_el *sel = 0; /* Stack element */ + int tlv_constr; + enum asn_OS_Subvariant type_variant = specs->subvariant; + + ASN_DEBUG("Decoding %s as %s (frame %ld)", + td->name, + (type_variant == ASN_OSUBV_STR) ? + "OCTET STRING" : "OS-SpecialCase", + (long)size); + + /* + * Create the string if does not exist. + */ + if(st == NULL) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) RETURN(RC_FAIL); + } + + /* Restore parsing context */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + switch(ctx->phase) { + case 0: + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, ctx, + buf_ptr, size, tag_mode, -1, + &ctx->left, &tlv_constr); + if(rval.code != RC_OK) + return rval; + + if(tlv_constr) { + /* + * Complex operation, requires stack of expectations. + */ + ctx->ptr = _new_stack(); + if(!ctx->ptr) { + RETURN(RC_FAIL); + } + } else { + /* + * Jump into stackless primitive decoding. + */ + _CH_PHASE(ctx, 3); + if(type_variant == ASN_OSUBV_ANY && tag_mode != 1) + APPEND(buf_ptr, rval.consumed); + ADVANCE(rval.consumed); + goto phase3; + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + phase1: + /* + * Fill the stack with expectations. + */ + stck = (struct _stack *)ctx->ptr; + sel = stck->cur_ptr; + do { + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_tag_t expected_tag; + ssize_t tl, ll, tlvl; + /* This one works even if (sel->left == -1) */ + size_t Left = ((!sel||(size_t)sel->left >= size) + ?size:(size_t)sel->left); + + + ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", (void *)sel, + (long)(sel?sel->left:0), + (long)(sel?sel->want_nulls:0), + (long)(sel?sel->got:0) + ); + if(sel && sel->left <= 0 && sel->want_nulls == 0) { + if(sel->prev) { + struct _stack_el *prev = sel->prev; + if(prev->left != -1) { + if(prev->left < sel->got) + RETURN(RC_FAIL); + prev->left -= sel->got; + } + prev->got += sel->got; + sel = stck->cur_ptr = prev; + if(!sel) break; + tlv_constr = 1; + continue; + } else { + sel = stck->cur_ptr = 0; + break; /* Nothing to wait */ + } + } + + tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); + ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", + (long)size, (long)Left, sel?"":"!", + (long)(sel?sel->left:0), + (long)(sel?sel->want_nulls:0), + (long)tl); + switch(tl) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); + + ll = ber_fetch_length(tlv_constr, + (const char *)buf_ptr + tl,Left - tl,&tlv_len); + ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld", + ber_tlv_tag_string(tlv_tag), tlv_constr, + (long)Left, (long)tl, (long)tlv_len, (long)ll); + switch(ll) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + if(sel && sel->want_nulls + && ((const uint8_t *)buf_ptr)[0] == 0 + && ((const uint8_t *)buf_ptr)[1] == 0) + { + + ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); + + if(type_variant == ASN_OSUBV_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND("\0\0", 2); + + ADVANCE(2); + sel->got += 2; + if(sel->left != -1) { + sel->left -= 2; /* assert(sel->left >= 2) */ + } + + sel->want_nulls--; + if(sel->want_nulls == 0) { + /* Move to the next expectation */ + sel->left = 0; + tlv_constr = 1; + } + + continue; + } + + /* + * Set up expected tags, + * depending on ASN.1 type being decoded. + */ + switch(type_variant) { + case ASN_OSUBV_BIT: + /* X.690: 8.6.4.1, NOTE 2 */ + /* Fall through */ + case ASN_OSUBV_STR: + default: + if(sel) { + unsigned level = sel->cont_level; + if(level < td->all_tags_count) { + expected_tag = td->all_tags[level]; + break; + } else if(td->all_tags_count) { + expected_tag = td->all_tags + [td->all_tags_count - 1]; + break; + } + /* else, Fall through */ + } + /* Fall through */ + case ASN_OSUBV_ANY: + expected_tag = tlv_tag; + break; + } + + + if(tlv_tag != expected_tag) { + char buf[2][32]; + ber_tlv_tag_snprint(tlv_tag, + buf[0], sizeof(buf[0])); + ber_tlv_tag_snprint(td->tags[td->tags_count-1], + buf[1], sizeof(buf[1])); + ASN_DEBUG("Tag does not match expectation: %s != %s", + buf[0], buf[1]); + RETURN(RC_FAIL); + } + + tlvl = tl + ll; /* Combined length of T and L encoding */ + if((tlv_len + tlvl) < 0) { + /* tlv_len value is too big */ + ASN_DEBUG("TLV encoding + length (%ld) is too big", + (long)tlv_len); + RETURN(RC_FAIL); + } + + /* + * Append a new expectation. + */ + sel = OS__add_stack_el(stck); + if(!sel) RETURN(RC_FAIL); + + sel->tag = tlv_tag; + + sel->want_nulls = (tlv_len==-1); + if(sel->prev && sel->prev->left != -1) { + /* Check that the parent frame is big enough */ + if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len)) + RETURN(RC_FAIL); + if(tlv_len == -1) + sel->left = sel->prev->left - tlvl; + else + sel->left = tlv_len; + } else { + sel->left = tlv_len; + } + if(type_variant == ASN_OSUBV_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND(buf_ptr, tlvl); + sel->got += tlvl; + ADVANCE(tlvl); + + ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%u", + (long)sel->got, (long)sel->left, + sel->want_nulls, sel->cont_level); + + } while(tlv_constr); + if(sel == NULL) { + /* Finished operation, "phase out" */ + ASN_DEBUG("Phase out"); + _CH_PHASE(ctx, +3); + break; + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 2: + stck = (struct _stack *)ctx->ptr; + sel = stck->cur_ptr; + ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", + (long)sel->left, (long)size, (long)sel->got, + sel->want_nulls); + { + ber_tlv_len_t len; + + assert(sel->left >= 0); + + len = ((ber_tlv_len_t)size < sel->left) + ? (ber_tlv_len_t)size : sel->left; + if(len > 0) { + if(type_variant == ASN_OSUBV_BIT + && sel->bits_chopped == 0) { + /* Put the unused-bits-octet away */ + st->bits_unused = *(const uint8_t *)buf_ptr; + APPEND(((const char *)buf_ptr+1), (len - 1)); + sel->bits_chopped = 1; + } else { + APPEND(buf_ptr, len); + } + ADVANCE(len); + sel->left -= len; + sel->got += len; + } + + if(sel->left) { + ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", + (long)sel->left, (long)size, sel->want_nulls); + RETURN(RC_WMORE); + } + + PREV_PHASE(ctx); + goto phase1; + } + break; + case 3: + phase3: + /* + * Primitive form, no stack required. + */ + assert(ctx->left >= 0); + + if(size < (size_t)ctx->left) { + if(!size) RETURN(RC_WMORE); + if(type_variant == ASN_OSUBV_BIT && !ctx->context) { + st->bits_unused = *(const uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } + APPEND(buf_ptr, size); + assert(ctx->context > 0); + ctx->left -= size; + ADVANCE(size); + RETURN(RC_WMORE); + } else { + if(type_variant == ASN_OSUBV_BIT + && !ctx->context && ctx->left) { + st->bits_unused = *(const uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } + APPEND(buf_ptr, ctx->left); + ADVANCE(ctx->left); + ctx->left = 0; + + NEXT_PHASE(ctx); + } + break; + } + + if(sel) { + ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", + (void *)sel->prev, sel->want_nulls, + (long)sel->left, (long)sel->got, (long)size); + if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { + RETURN(RC_WMORE); + } + } + + /* + * BIT STRING-specific processing. + */ + if(type_variant == ASN_OSUBV_BIT) { + if(st->size) { + if(st->bits_unused < 0 || st->bits_unused > 7) { + RETURN(RC_FAIL); + } + /* Finalize BIT STRING: zero out unused bits. */ + st->buf[st->size-1] &= 0xff << st->bits_unused; + } else { + if(st->bits_unused) { + RETURN(RC_FAIL); + } + } + } + + ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", + (long)consumed_myself, td->name, + (type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "", + (long)st->size); + + + RETURN(RC_OK); +} + +/* + * Encode OCTET STRING type using DER. + */ +asn_enc_rval_t +OCTET_STRING_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = { 0, 0, 0 }; + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + enum asn_OS_Subvariant type_variant = specs->subvariant; + int fix_last_byte = 0; + + ASN_DEBUG("%s %s as OCTET STRING", + cb?"Estimating":"Encoding", td->name); + + /* + * Write tags. + */ + if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) { + er.encoded = der_write_tags(td, + (type_variant == ASN_OSUBV_BIT) + st->size, + tag_mode, type_variant == ASN_OSUBV_ANY, tag, + cb, app_key); + if(er.encoded == -1) { + er.failed_type = td; + er.structure_ptr = sptr; + return er; + } + } else { + /* Disallow: [] IMPLICIT ANY */ + assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1); + er.encoded = 0; + } + + if(!cb) { + er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size; + ASN__ENCODED_OK(er); + } + + /* + * Prepare to deal with the last octet of BIT STRING. + */ + if(type_variant == ASN_OSUBV_BIT) { + uint8_t b = st->bits_unused & 0x07; + if(b && st->size) fix_last_byte = 1; + ASN__CALLBACK(&b, 1); + } + + /* Invoke callback for the main part of the buffer */ + ASN__CALLBACK(st->buf, st->size - fix_last_byte); + + /* The last octet should be stripped off the unused bits */ + if(fix_last_byte) { + uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused); + ASN__CALLBACK(&b, 1); + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_enc_rval_t +OCTET_STRING_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + if(flags & XER_F_CANONICAL) { + char *scend = scratch + (sizeof(scratch) - 2); + for(; buf < end; buf++) { + if(p >= scend) { + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + } + + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + } else { + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + p = scratch; + ASN__TEXT_INDENT(1, ilevel); + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + if(p - scratch) { + p--; /* Remove the tail space */ + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + if(st->size > 16) + ASN__TEXT_INDENT(1, ilevel-1); + } + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +static const struct OCTET_STRING__xer_escape_table_s { + const char *string; + int size; +} OCTET_STRING__xer_escape_table[] = { +#define OSXET(s) { s, sizeof(s) - 1 } + OSXET("\074\156\165\154\057\076"), /* */ + OSXET("\074\163\157\150\057\076"), /* */ + OSXET("\074\163\164\170\057\076"), /* */ + OSXET("\074\145\164\170\057\076"), /* */ + OSXET("\074\145\157\164\057\076"), /* */ + OSXET("\074\145\156\161\057\076"), /* */ + OSXET("\074\141\143\153\057\076"), /* */ + OSXET("\074\142\145\154\057\076"), /* */ + OSXET("\074\142\163\057\076"), /* */ + OSXET("\011"), /* \t */ + OSXET("\012"), /* \n */ + OSXET("\074\166\164\057\076"), /* */ + OSXET("\074\146\146\057\076"), /* */ + OSXET("\015"), /* \r */ + OSXET("\074\163\157\057\076"), /* */ + OSXET("\074\163\151\057\076"), /* */ + OSXET("\074\144\154\145\057\076"), /* */ + OSXET("\074\144\143\061\057\076"), /* */ + OSXET("\074\144\143\062\057\076"), /* */ + OSXET("\074\144\143\063\057\076"), /* */ + OSXET("\074\144\143\064\057\076"), /* */ + OSXET("\074\156\141\153\057\076"), /* */ + OSXET("\074\163\171\156\057\076"), /* */ + OSXET("\074\145\164\142\057\076"), /* */ + OSXET("\074\143\141\156\057\076"), /* */ + OSXET("\074\145\155\057\076"), /* */ + OSXET("\074\163\165\142\057\076"), /* */ + OSXET("\074\145\163\143\057\076"), /* */ + OSXET("\074\151\163\064\057\076"), /* */ + OSXET("\074\151\163\063\057\076"), /* */ + OSXET("\074\151\163\062\057\076"), /* */ + OSXET("\074\151\163\061\057\076"), /* */ + { 0, 0 }, /* " " */ + { 0, 0 }, /* ! */ + { 0, 0 }, /* \" */ + { 0, 0 }, /* # */ + { 0, 0 }, /* $ */ + { 0, 0 }, /* % */ + OSXET("\046\141\155\160\073"), /* & */ + { 0, 0 }, /* ' */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ + {0,0},{0,0},{0,0},{0,0}, /* 89:; */ + OSXET("\046\154\164\073"), /* < */ + { 0, 0 }, /* = */ + OSXET("\046\147\164\073"), /* > */ +}; + +static int +OS__check_escaped_control_char(const void *buf, int size) { + size_t i; + /* + * Inefficient algorithm which translates the escape sequences + * defined above into characters. Returns -1 if not found. + * TODO: replace by a faster algorithm (bsearch(), hash or + * nested table lookups). + */ + for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) { + const struct OCTET_STRING__xer_escape_table_s *el; + el = &OCTET_STRING__xer_escape_table[i]; + if(el->size == size && memcmp(buf, el->string, size) == 0) + return i; + } + return -1; +} + +static int +OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size_t chunk_size) { + /* + * This might be one of the escape sequences + * for control characters. Check it out. + * #11.15.5 + */ + int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size); + if(control_char >= 0) { + OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr; + void *p = REALLOC(st->buf, st->size + 2); + if(p) { + st->buf = (uint8_t *)p; + st->buf[st->size++] = control_char; + st->buf[st->size] = '\0'; /* nul-termination */ + return 0; + } + } + + return -1; /* No, it's not */ +} + +asn_enc_rval_t +OCTET_STRING_encode_xer_utf8(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + uint8_t *buf, *end; + uint8_t *ss; /* Sequence start */ + ssize_t encoded_len = 0; + + (void)ilevel; /* Unused argument */ + (void)flags; /* Unused argument */ + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + buf = st->buf; + end = buf + st->size; + for(ss = buf; buf < end; buf++) { + unsigned int ch = *buf; + int s_len; /* Special encoding sequence length */ + + /* + * Escape certain characters: X.680/11.15 + */ + if(ch < sizeof(OCTET_STRING__xer_escape_table) + /sizeof(OCTET_STRING__xer_escape_table[0]) + && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, + app_key) < 0) + ASN__ENCODE_FAILED; + encoded_len += (buf - ss) + s_len; + ss = buf + 1; + } + } + + encoded_len += (buf - ss); + if((buf - ss) && cb(ss, buf - ss, app_key) < 0) + ASN__ENCODE_FAILED; + + er.encoded = encoded_len; + ASN__ENCODED_OK(er); +} + +/* + * Convert from hexadecimal format (cstring): "AB CD EF" + */ +static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + const char *chunk_stop = (const char *)chunk_buf; + const char *p = chunk_stop; + const char *pend = p + chunk_size; + unsigned int clv = 0; + int half = 0; /* Half bit */ + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + size_t new_size = st->size + (chunk_size + 1) / 2; + void *nptr = REALLOC(st->buf, new_size + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * If something like " a b c " appears here, the " a b":3 will be + * converted, and the rest skipped. That is, unless buf_size is greater + * than chunk_size, then it'll be equivalent to "ABC0". + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + continue; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + clv = (clv << 4) + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + clv = (clv << 4) + (ch - 0x41 + 10); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + clv = (clv << 4) + (ch - 0x61 + 10); + break; + default: + *buf = 0; /* JIC */ + return -1; + } + if(half++) { + half = 0; + *buf++ = clv; + chunk_stop = p + 1; + } + } + + /* + * Check partial decoding. + */ + if(half) { + if(have_more) { + /* + * Partial specification is fine, + * because no more more PXER_TEXT data is available. + */ + *buf++ = clv << 4; + chunk_stop = p; + } + } else { + chunk_stop = p; + } + + st->size = buf - st->buf; /* Adjust the buffer size */ + assert(st->size <= new_size); + st->buf[st->size] = 0; /* Courtesy termination */ + + return (chunk_stop - (const char *)chunk_buf); /* Converted size */ +} + +/* + * Convert from binary format: "00101011101" + */ +static ssize_t OCTET_STRING__convert_binary(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + int bits_unused = st->bits_unused & 0x7; + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + size_t new_size = st->size + (chunk_size + 7) / 8; + void *nptr = REALLOC(st->buf, new_size + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + (void)have_more; + + if(bits_unused == 0) + bits_unused = 8; + else if(st->size) + buf--; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + break; + case 0x30: + case 0x31: + if(bits_unused-- <= 0) { + *++buf = 0; /* Clean the cell */ + bits_unused = 7; + } + *buf |= (ch&1) << bits_unused; + break; + default: + st->bits_unused = bits_unused; + return -1; + } + } + + if(bits_unused == 8) { + st->size = buf - st->buf; + st->bits_unused = 0; + } else { + st->size = buf - st->buf + 1; + st->bits_unused = bits_unused; + } + + assert(st->size <= new_size); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Something like strtod(), but with stricter rules. + */ +static int +OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { + const int32_t last_unicode_codepoint = 0x10ffff; + int32_t val = 0; + const char *p; + + for(p = buf; p < end; p++) { + int ch = *p; + + switch(ch) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + val = val * base + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + val = val * base + (ch - 0x41 + 10); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + val = val * base + (ch - 0x61 + 10); + break; + case 0x3b: /* ';' */ + *ret_value = val; + return (p - buf) + 1; + default: + return -1; /* Character set error */ + } + + /* Value exceeds the Unicode range. */ + if(val > last_unicode_codepoint) { + return -1; + } + } + + *ret_value = -1; + return (p - buf); +} + +/* + * Convert from the plain UTF-8 format, expanding entity references: "2 < 3" + */ +static ssize_t +OCTET_STRING__convert_entrefs(void *sptr, const void *chunk_buf, + size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + uint8_t *buf; + + /* Reallocate buffer */ + size_t new_size = st->size + chunk_size; + void *nptr = REALLOC(st->buf, new_size + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + int len; /* Length of the rest of the chunk */ + + if(ch != 0x26 /* '&' */) { + *buf++ = ch; + continue; /* That was easy... */ + } + + /* + * Process entity reference. + */ + len = chunk_size - (p - (const char *)chunk_buf); + if(len == 1 /* "&" */) goto want_more; + if(p[1] == 0x23 /* '#' */) { + const char *pval; /* Pointer to start of digits */ + int32_t val = 0; /* Entity reference value */ + int base; + + if(len == 2 /* "&#" */) goto want_more; + if(p[2] == 0x78 /* 'x' */) + pval = p + 3, base = 16; + else + pval = p + 2, base = 10; + len = OS__strtoent(base, pval, p + len, &val); + if(len == -1) { + /* Invalid charset. Just copy verbatim. */ + *buf++ = ch; + continue; + } + if(!len || pval[len-1] != 0x3b) goto want_more; + assert(val > 0); + p += (pval - p) + len - 1; /* Advance past entref */ + + if(val < 0x80) { + *buf++ = (char)val; + } else if(val < 0x800) { + *buf++ = 0xc0 | ((val >> 6)); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x10000) { + *buf++ = 0xe0 | ((val >> 12)); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x200000) { + *buf++ = 0xf0 | ((val >> 18)); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x4000000) { + *buf++ = 0xf8 | ((val >> 24)); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else { + *buf++ = 0xfc | ((val >> 30) & 0x1); + *buf++ = 0x80 | ((val >> 24) & 0x3f); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } + } else { + /* + * Ugly, limited parsing of & > < + */ + char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len); + if(!sc) goto want_more; + if((sc - p) == 4 + && p[1] == 0x61 /* 'a' */ + && p[2] == 0x6d /* 'm' */ + && p[3] == 0x70 /* 'p' */) { + *buf++ = 0x26; + p = sc; + continue; + } + if((sc - p) == 3) { + if(p[1] == 0x6c) { + *buf = 0x3c; /* '<' */ + } else if(p[1] == 0x67) { + *buf = 0x3e; /* '>' */ + } else { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + if(p[2] != 0x74) { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + buf++; + p = sc; + continue; + } + /* Unsupported entity reference */ + *buf++ = ch; + } + + continue; + want_more: + if(have_more) { + /* + * We know that no more data (of the same type) + * is coming. Copy the rest verbatim. + */ + *buf++ = ch; + continue; + } + chunk_size = (p - (const char *)chunk_buf); + /* Processing stalled: need more data */ + break; + } + + st->size = buf - st->buf; + assert(st->size <= new_size); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Decode OCTET STRING from the XML element's body. + */ +static asn_dec_rval_t +OCTET_STRING__decode_xer( + const asn_codec_ctx_t *opt_codec_ctx, const asn_TYPE_descriptor_t *td, + void **sptr, const char *opt_mname, const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder)(void *struct_ptr, const void *chunk_buf, + size_t chunk_size), + ssize_t (*body_receiver)(void *struct_ptr, const void *chunk_buf, + size_t chunk_size, int have_more)) { + OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t *ctx; /* Per-structure parser context */ + asn_dec_rval_t rval; /* Return value from the decoder */ + int st_allocated; + + /* + * Create the string if does not exist. + */ + if(!st) { + st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); + *sptr = (void *)st; + if(!st) goto sta_failed; + st_allocated = 1; + } else { + st_allocated = 0; + } + if(!st->buf) { + /* This is separate from above section */ + st->buf = (uint8_t *)CALLOC(1, 1); + if(!st->buf) { + if(st_allocated) { + *sptr = 0; + goto stb_failed; + } else { + goto sta_failed; + } + } + } + + /* Restore parsing context */ + ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset); + + return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag, + buf_ptr, size, opt_unexpected_tag_decoder, body_receiver); + +stb_failed: + FREEMEM(st); +sta_failed: + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; +} + +/* + * Decode OCTET STRING from the hexadecimal data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_hex(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal); +} + +/* + * Decode OCTET STRING from the binary (0/1) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_binary(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_binary); +} + +/* + * Decode OCTET STRING from the string (ASCII/UTF-8) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_utf8(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, + OCTET_STRING__handle_control_chars, + OCTET_STRING__convert_entrefs); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +static int +OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, const asn_per_constraints_t *pc) { + uint8_t *end = buf + units * bpc; + + ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d", + (int)units, lb, ub, unit_bits); + + /* X.691: 27.5.4 */ + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { + /* Decode without translation */ + lb = 0; + } else if(pc && pc->code2value) { + if(unit_bits > 16) + return 1; /* FATAL: can't have constrained + * UniversalString with more than + * 16 million code points */ + for(; buf < end; buf += bpc) { + int value; + int code = per_get_few_bits(po, unit_bits); + if(code < 0) return -1; /* WMORE */ + value = pc->code2value(code); + if(value < 0) { + ASN_DEBUG("Code %d (0x%02x) is" + " not in map (%ld..%ld)", + code, code, lb, ub); + return 1; /* FATAL */ + } + switch(bpc) { + case 1: *buf = value; break; + case 2: buf[0] = value >> 8; buf[1] = value; break; + case 4: buf[0] = value >> 24; buf[1] = value >> 16; + buf[2] = value >> 8; buf[3] = value; break; + } + } + return 0; + } + + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_get_many_bits(po, buf, 0, unit_bits * units); + } + + for(; buf < end; buf += bpc) { + int32_t code = per_get_few_bits(po, unit_bits); + int32_t ch = code + lb; + if(code < 0) return -1; /* WMORE */ + if(ch > ub) { + ASN_DEBUG("Code %d is out of range (%ld..%ld)", + ch, lb, ub); + return 1; /* FATAL */ + } + switch(bpc) { + case 1: *buf = ch; break; + case 2: buf[0] = ch >> 8; buf[1] = ch; break; + case 4: buf[0] = ch >> 24; buf[1] = ch >> 16; + buf[2] = ch >> 8; buf[3] = ch; break; + } + } + + return 0; +} + +static int +OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, const asn_per_constraints_t *pc) { + const uint8_t *end = buf + units * bpc; + + ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", + (int)units, lb, ub, unit_bits, bpc); + + /* X.691: 27.5.4 */ + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { + /* Encode as is */ + lb = 0; + } else if(pc && pc->value2code) { + for(; buf < end; buf += bpc) { + int code; + uint32_t value; + switch(bpc) { + case 1: value = *(const uint8_t *)buf; break; + case 2: value = (buf[0] << 8) | buf[1]; break; + case 4: value = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; break; + default: return -1; + } + code = pc->value2code(value); + if(code < 0) { + ASN_DEBUG("Character %d (0x%02x) is" + " not in map (%ld..%ld)", + *buf, *buf, lb, ub); + return -1; + } + if(per_put_few_bits(po, code, unit_bits)) + return -1; + } + } + + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_put_many_bits(po, buf, unit_bits * units); + } + + for(ub -= lb; buf < end; buf += bpc) { + int ch; + uint32_t value; + switch(bpc) { + case 1: + value = *(const uint8_t *)buf; + break; + case 2: + value = (buf[0] << 8) | buf[1]; + break; + case 4: + value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + break; + default: + return -1; + } + ch = value - lb; + if(ch < 0 || ch > ub) { + ASN_DEBUG("Character %d (0x%02x) is out of range (%ld..%ld)", *buf, + value, lb, ub + lb); + return -1; + } + if(per_put_few_bits(po, ch, unit_bits)) return -1; + } + + return 0; +} + +static asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = { + { APC_CONSTRAINED, 8, 8, 0, 255 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, + 0, 0 +}; + +asn_dec_rval_t +OCTET_STRING_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const asn_per_constraints_t *pc = + constraints ? constraints : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *cval; + const asn_per_constraint_t *csiz; + asn_dec_rval_t rval = { RC_OK, 0 }; + OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; + ssize_t consumed_myself = 0; + int repeat; + enum { + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + + (void)opt_codec_ctx; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + case ASN_OSUBV_BIT: + ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); + RETURN(RC_FAIL); + break; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + break; + } + + /* + * Allocate the string. + */ + if(!st) { + st = (OCTET_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); + + if(csiz->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) RETURN(RC_WMORE); + if(inext) { + csiz = &asn_DEF_OCTET_STRING_constraints.size; + unit_bits = canonical_unit_bits; + } + } + + if(csiz->effective_bits >= 0) { + FREEMEM(st->buf); + if(bpc) { + st->size = csiz->upper_bound * bpc; + } else { + st->size = (csiz->upper_bound + 7) >> 3; + } + st->buf = (uint8_t *)MALLOC(st->size + 1); + if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits == 0) { + int ret; + if(bpc) { + ASN_DEBUG("Encoding OCTET STRING size %ld", + csiz->upper_bound); + ret = OCTET_STRING_per_get_characters(pd, st->buf, + csiz->upper_bound, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + } else { + ASN_DEBUG("Encoding BIT STRING size %ld", + csiz->upper_bound); + ret = per_get_many_bits(pd, st->buf, 0, + unit_bits * csiz->upper_bound); + } + if(ret < 0) RETURN(RC_WMORE); + consumed_myself += unit_bits * csiz->upper_bound; + st->buf[st->size] = 0; + RETURN(RC_OK); + } + + st->size = 0; + do { + ssize_t raw_len; + ssize_t len_bytes; + void *p; + int ret; + + /* Get the PER length */ + raw_len = uper_get_length(pd, csiz->effective_bits, csiz->lower_bound, + &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + if(raw_len == 0 && st->buf) break; + + ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", + (long)csiz->effective_bits, (long)raw_len, + repeat ? "repeat" : "once", td->name); + len_bytes = raw_len * bpc; + p = REALLOC(st->buf, st->size + len_bytes + 1); + if(!p) RETURN(RC_FAIL); + st->buf = (uint8_t *)p; + + ret = OCTET_STRING_per_get_characters(pd, &st->buf[st->size], raw_len, + bpc, unit_bits, cval->lower_bound, + cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + if(ret < 0) RETURN(RC_WMORE); + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + return rval; +} + +asn_enc_rval_t +OCTET_STRING_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const asn_per_constraints_t *pc = constraints ? constraints + : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *cval; + const asn_per_constraint_t *csiz; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + int inext = 0; /* Lies not within extension root */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + size_t size_in_units; + const uint8_t *buf; + int ret; + enum { + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + int ct_extensible; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + ct_extensible = csiz->flags & APC_EXTENSIBLE; + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + case ASN_OSUBV_BIT: + ASN__ENCODE_FAILED; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + size_in_units = st->size; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + size_in_units = st->size >> 1; + if(st->size & 1) { + ASN_DEBUG("%s string size is not modulo 2", td->name); + ASN__ENCODE_FAILED; + } + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + size_in_units = st->size >> 2; + if(st->size & 3) { + ASN_DEBUG("%s string size is not modulo 4", td->name); + ASN__ENCODE_FAILED; + } + break; + } + + ASN_DEBUG("Encoding %s into %" ASN_PRI_SIZE " units of %d bits" + " (%ld..%ld, effective %d)%s", + td->name, size_in_units, unit_bits, + csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, ct_extensible ? " EXT" : ""); + + /* Figure out whether size lies within PER visible constraint */ + + if(csiz->effective_bits >= 0) { + if((ssize_t)size_in_units < csiz->lower_bound + || (ssize_t)size_in_units > csiz->upper_bound) { + if(ct_extensible) { + csiz = &asn_DEF_OCTET_STRING_constraints.size; + unit_bits = canonical_unit_bits; + inext = 1; + } else { + ASN__ENCODE_FAILED; + } + } + } else { + inext = 0; + } + + if(ct_extensible) { + /* Declare whether length is [not] within extension root */ + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + } + + if(csiz->effective_bits >= 0 && !inext) { + ASN_DEBUG("Encoding %" ASN_PRI_SIZE " bytes (%ld), length in %d bits", st->size, + size_in_units - csiz->lower_bound, csiz->effective_bits); + ret = per_put_few_bits(po, size_in_units - csiz->lower_bound, + csiz->effective_bits); + if(ret) ASN__ENCODE_FAILED; + ret = OCTET_STRING_per_put_characters(po, st->buf, size_in_units, bpc, + unit_bits, cval->lower_bound, + cval->upper_bound, pc); + if(ret) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + ASN_DEBUG("Encoding %" ASN_PRI_SIZE " bytes", st->size); + + buf = st->buf; + ASN_DEBUG("Encoding %" ASN_PRI_SIZE " in units", size_in_units); + do { + int need_eom = 0; + ssize_t may_save = uper_put_length(po, size_in_units, &need_eom); + if(may_save < 0) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %" ASN_PRI_SSIZE " of %" ASN_PRI_SIZE "%s", may_save, size_in_units, + need_eom ? ",+EOM" : ""); + + ret = OCTET_STRING_per_put_characters(po, buf, may_save, bpc, unit_bits, + cval->lower_bound, + cval->upper_bound, pc); + if(ret) ASN__ENCODE_FAILED; + + buf += may_save * bpc; + size_in_units -= may_save; + assert(!(may_save & 0x07) || !size_in_units); + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + } while(size_in_units); + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +OCTET_STRING_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const asn_per_constraints_t *pc = constraints ? constraints + : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *cval; + const asn_per_constraint_t *csiz; + asn_dec_rval_t rval = { RC_OK, 0 }; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + ssize_t consumed_myself = 0; + int repeat; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + + (void)opt_codec_ctx; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + + switch(specs->subvariant) { + default: +/* case ASN_OSUBV_ANY: + ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); + RETURN(RC_FAIL); +*/ + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + break; + case ASN_OSUBV_ANY: + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; +/* if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; +*/ + bpc = OS__BPC_CHAR; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + break; + } + + /* + * Allocate the string. + */ + if(!st) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); + + if(csiz->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) RETURN(RC_WMORE); + if(inext) { + csiz = &asn_DEF_OCTET_STRING_constraints.size; + cval = &asn_DEF_OCTET_STRING_constraints.value; + unit_bits = canonical_unit_bits; + } + } + + if(csiz->effective_bits >= 0) { + FREEMEM(st->buf); + if(bpc) { + st->size = csiz->upper_bound * bpc; + } else { + st->size = (csiz->upper_bound + 7) >> 3; + } + st->buf = (uint8_t *)MALLOC(st->size + 1); + if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits == 0) { + int ret; + if (st->size > 2) { /* X.691 #16 NOTE 1 */ + if (aper_get_align(pd) < 0) + RETURN(RC_FAIL); + } + if(bpc) { + ASN_DEBUG("Decoding OCTET STRING size %ld", + csiz->upper_bound); + ret = OCTET_STRING_per_get_characters(pd, st->buf, + csiz->upper_bound, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + } else { + ASN_DEBUG("Decoding BIT STRING size %ld", + csiz->upper_bound); + ret = per_get_many_bits(pd, st->buf, 0, + unit_bits * csiz->upper_bound); + } + if(ret < 0) RETURN(RC_WMORE); + consumed_myself += unit_bits * csiz->upper_bound; + st->buf[st->size] = 0; + if(bpc == 0) { + int ubs = (csiz->upper_bound & 0x7); + st->bits_unused = ubs ? 8 - ubs : 0; + } + RETURN(RC_OK); + } + + st->size = 0; + do { + ssize_t raw_len; + ssize_t len_bytes; + ssize_t len_bits; + void *p; + int ret; + + /* Get the PER length */ + if (csiz->upper_bound - csiz->lower_bound == 0) + /* Indefinite length case */ + raw_len = aper_get_length(pd, -1, csiz->effective_bits, &repeat); + else + raw_len = aper_get_length(pd, csiz->upper_bound - csiz->lower_bound + 1, csiz->effective_bits, &repeat); + repeat = 0; + if(raw_len < 0) RETURN(RC_WMORE); + raw_len += csiz->lower_bound; + + ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", + (long)csiz->effective_bits, (long)raw_len, + repeat ? "repeat" : "once", td->name); + + if (raw_len > 2) { /* X.691 #16 NOTE 1 */ + if (aper_get_align(pd) < 0) + RETURN(RC_FAIL); + } + + if(bpc) { + len_bytes = raw_len * bpc; + len_bits = len_bytes * unit_bits; + } else { + len_bits = raw_len; + len_bytes = (len_bits + 7) >> 3; + if(len_bits & 0x7) + st->bits_unused = 8 - (len_bits & 0x7); + /* len_bits be multiple of 16K if repeat is set */ + } + p = REALLOC(st->buf, st->size + len_bytes + 1); + if(!p) RETURN(RC_FAIL); + st->buf = (uint8_t *)p; + + if(bpc) { + ret = OCTET_STRING_per_get_characters(pd, + &st->buf[st->size], raw_len, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + } else { + ret = per_get_many_bits(pd, &st->buf[st->size], + 0, len_bits); + } + if(ret < 0) RETURN(RC_WMORE); + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + return rval; +} + +asn_enc_rval_t +OCTET_STRING_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const asn_per_constraints_t *pc = constraints ? constraints + : td->encoding_constraints.per_constraints; + const asn_per_constraint_t *cval; + const asn_per_constraint_t *csiz; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + int inext = 0; /* Lies not within extension root */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + unsigned int sizeinunits; + const uint8_t *buf; + int ret; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + int ct_extensible; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + ct_extensible = csiz->flags & APC_EXTENSIBLE; + + switch(specs->subvariant) { + default: + /* case ASN_OSUBV_ANY: + ASN__ENCODE_FAILED; + */ + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + sizeinunits = st->size * 8 - (st->bits_unused & 0x07); + ASN_DEBUG("BIT STRING of %d bytes", + sizeinunits); + break; + case ASN_OSUBV_ANY: + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; +/* if(cval->flags & APC_CONSTRAINED) + unit_bits = 8; +*/ + bpc = OS__BPC_CHAR; + sizeinunits = st->size; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + sizeinunits = st->size / 2; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + sizeinunits = st->size / 4; + break; + } + + ASN_DEBUG("Encoding %s into %d units of %d bits" + " (%ld..%ld, effective %d)%s", + td->name, sizeinunits, unit_bits, + csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, ct_extensible ? " EXT" : ""); + + /* Figure out wheter size lies within PER visible constraint */ + + if(csiz->effective_bits >= 0) { + if((int)sizeinunits < csiz->lower_bound + || (int)sizeinunits > csiz->upper_bound) { + if(ct_extensible) { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + unit_bits = canonical_unit_bits; + inext = 1; + } else + ASN__ENCODE_FAILED; + } + } else { + inext = 0; + } + + + if(ct_extensible) { + /* Declare whether length is [not] within extension root */ + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits >= 0) { + ASN_DEBUG("Encoding %lu bytes (%ld), length in %d bits", + st->size, sizeinunits - csiz->lower_bound, + csiz->effective_bits); + if (csiz->effective_bits > 0) { + ret = aper_put_length(po, csiz->upper_bound - csiz->lower_bound + 1, sizeinunits - csiz->lower_bound); + if(ret) ASN__ENCODE_FAILED; + } + /* EB MOD + AFAIU if lb != ub it is aligned whatever the number of bits */ + if ((st->size > 2) || (csiz->lower_bound != csiz->upper_bound)) { /* X.691 #16.11 */ + if (aper_put_align(po) < 0) + ASN__ENCODE_FAILED; + } + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, st->buf, + sizeinunits, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + } else { + ret = per_put_many_bits(po, st->buf, + sizeinunits * unit_bits); + } + if(ret) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + ASN_DEBUG("Encoding %lu bytes", st->size); + + if(sizeinunits == 0) { + if(aper_put_length(po, -1, 0)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + buf = st->buf; + while(sizeinunits) { + ssize_t maySave = aper_put_length(po, -1, sizeinunits); + + if(maySave < 0) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %ld of %ld", + (long)maySave, (long)sizeinunits); + + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, buf, + maySave, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + } else { + ret = per_put_many_bits(po, buf, maySave * unit_bits); + } + if(ret) ASN__ENCODE_FAILED; + + if(bpc) + buf += maySave * bpc; + else + buf += maySave >> 3; + sizeinunits -= maySave; + assert(!(maySave & 0x07) || !sizeinunits); + } + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +OCTET_STRING_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + + (void)td; /* Unused argument */ + + if(!st || (!st->buf && st->size)) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + _i_INDENT(1); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + + if(p > scratch) { + p--; /* Remove the tail space */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + } + + return 0; +} + +int +OCTET_STRING_print_utf8(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, + void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(st && (st->buf || !st->size)) { + return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +OCTET_STRING_free(const asn_TYPE_descriptor_t *td, void *sptr, + enum asn_struct_free_method method) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + const asn_OCTET_STRING_specifics_t *specs; + asn_struct_ctx_t *ctx; + struct _stack *stck; + + if(!td || !st) + return; + + specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + ASN_DEBUG("Freeing %s as OCTET STRING", td->name); + + if(st->buf) { + FREEMEM(st->buf); + st->buf = 0; + } + + /* + * Remove decode-time stack. + */ + stck = (struct _stack *)ctx->ptr; + if(stck) { + while(stck->tail) { + struct _stack_el *sel = stck->tail; + stck->tail = sel->prev; + FREEMEM(sel); + } + FREEMEM(stck); + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(sptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(sptr, 0, + td->specifics + ? ((const asn_OCTET_STRING_specifics_t *)(td->specifics)) + ->struct_size + : sizeof(OCTET_STRING_t)); + break; + } +} + +/* + * Conversion routines. + */ +int +OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { + void *buf; + + if(st == 0 || (str == 0 && len)) { + errno = EINVAL; + return -1; + } + + /* + * Clear the OCTET STRING. + */ + if(str == NULL) { + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + return 0; + } + + /* Determine the original string size, if not explicitly given */ + if(len < 0) + len = strlen(str); + + /* Allocate and fill the memory */ + buf = MALLOC(len + 1); + if(buf == NULL) + return -1; + + memcpy(buf, str, len); + ((uint8_t *)buf)[len] = '\0'; /* Couldn't use memcpy(len+1)! */ + FREEMEM(st->buf); + st->buf = (uint8_t *)buf; + st->size = len; + + return 0; +} + +OCTET_STRING_t * +OCTET_STRING_new_fromBuf(const asn_TYPE_descriptor_t *td, const char *str, + int len) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + OCTET_STRING_t *st; + + st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); + if(st && str && OCTET_STRING_fromBuf(st, str, len)) { + FREEMEM(st); + st = NULL; + } + + return st; +} + +/* + * Lexicographically compare the common prefix of both strings, + * and if it is the same return -1 for the smallest string. + */ +int +OCTET_STRING_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics; + const OCTET_STRING_t *a = aptr; + const OCTET_STRING_t *b = bptr; + + assert(!specs || specs->subvariant != ASN_OSUBV_BIT); + + if(a && b) { + size_t common_prefix_size = a->size <= b->size ? a->size : b->size; + int ret = memcmp(a->buf, b->buf, common_prefix_size); + if(ret == 0) { + /* Figure out which string with equal prefixes is longer. */ + if(a->size < b->size) { + return -1; + } else if(a->size > b->size) { + return 1; + } else { + return 0; + } + } else { + return ret < 0 ? -1 : 1; + } + } else if(!a && !b) { + return 0; + } else if(!a) { + return -1; + } else { + return 1; + } + +} + +/* + * Biased function for randomizing character values around their limits. + */ +static uint32_t +OCTET_STRING__random_char(unsigned long lb, unsigned long ub) { + assert(lb <= ub); + switch(asn_random_between(0, 16)) { + case 0: + if(lb < ub) return lb + 1; + /* Fall through */ + case 1: + return lb; + case 2: + if(lb < ub) return ub - 1; + /* Fall through */ + case 3: + return ub; + default: + return asn_random_between(lb, ub); + } +} + + +size_t +OCTET_STRING_random_length_constrained( + const asn_TYPE_descriptor_t *td, + const asn_encoding_constraints_t *constraints, size_t max_length) { + const unsigned lengths[] = {0, 1, 2, 3, 4, 8, + 126, 127, 128, 16383, 16384, 16385, + 65534, 65535, 65536, 65537}; + size_t rnd_len; + + /* Figure out how far we should go */ + rnd_len = lengths[asn_random_between( + 0, sizeof(lengths) / sizeof(lengths[0]) - 1)]; + + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->size; + if(pc->flags & APC_CONSTRAINED) { + long suggested_upper_bound = pc->upper_bound < (ssize_t)max_length + ? pc->upper_bound + : (ssize_t)max_length; + if(max_length <= (size_t)pc->lower_bound) { + return pc->lower_bound; + } + if(pc->flags & APC_EXTENSIBLE) { + switch(asn_random_between(0, 5)) { + case 0: + if(pc->lower_bound > 0) { + rnd_len = pc->lower_bound - 1; + break; + } + /* Fall through */ + case 1: + rnd_len = pc->upper_bound + 1; + break; + case 2: + /* Keep rnd_len from the table */ + if(rnd_len <= max_length) { + break; + } + /* Fall through */ + default: + rnd_len = asn_random_between(pc->lower_bound, + suggested_upper_bound); + } + } else { + rnd_len = + asn_random_between(pc->lower_bound, suggested_upper_bound); + } + } else { + rnd_len = asn_random_between(0, max_length); + } + } else if(rnd_len > max_length) { + rnd_len = asn_random_between(0, max_length); + } + + return rnd_len; +} + +asn_random_fill_result_t +OCTET_STRING_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + unsigned int unit_bytes = 1; + unsigned long clb = 0; /* Lower bound on char */ + unsigned long cub = 255; /* Higher bound on char value */ + uint8_t *buf; + uint8_t *bend; + uint8_t *b; + size_t rnd_len; + OCTET_STRING_t *st; + + if(max_length == 0 && !*sptr) return result_skipped; + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + return result_failed; + case ASN_OSUBV_BIT: + /* Handled by BIT_STRING itself. */ + return result_failed; + case ASN_OSUBV_STR: + unit_bytes = 1; + clb = 0; + cub = 255; + break; + case ASN_OSUBV_U16: + unit_bytes = 2; + clb = 0; + cub = 65535; + break; + case ASN_OSUBV_U32: + unit_bytes = 4; + clb = 0; + cub = 0x10FFFF; + break; + } + + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->value; + if(pc->flags & APC_SEMI_CONSTRAINED) { + clb = pc->lower_bound; + } else if(pc->flags & APC_CONSTRAINED) { + clb = pc->lower_bound; + cub = pc->upper_bound; + } + } + + rnd_len = + OCTET_STRING_random_length_constrained(td, constraints, max_length); + + buf = CALLOC(unit_bytes, rnd_len + 1); + if(!buf) return result_failed; + + bend = &buf[unit_bytes * rnd_len]; + + switch(unit_bytes) { + case 1: + for(b = buf; b < bend; b += unit_bytes) { + *(uint8_t *)b = OCTET_STRING__random_char(clb, cub); + } + *(uint8_t *)b = 0; + break; + case 2: + for(b = buf; b < bend; b += unit_bytes) { + uint32_t code = OCTET_STRING__random_char(clb, cub); + b[0] = code >> 8; + b[1] = code; + } + *(uint16_t *)b = 0; + break; + case 4: + for(b = buf; b < bend; b += unit_bytes) { + uint32_t code = OCTET_STRING__random_char(clb, cub); + b[0] = code >> 24; + b[1] = code >> 16; + b[2] = code >> 8; + b[3] = code; + } + *(uint32_t *)b = 0; + break; + } + + if(*sptr) { + st = *sptr; + FREEMEM(st->buf); + } else { + st = (OCTET_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) { + FREEMEM(buf); + return result_failed; + } + } + + st->buf = buf; + st->size = unit_bytes * rnd_len; + + result_ok.length = st->size; + return result_ok; +} diff --git a/src/codec_utils/E2SMKPM/OCTET_STRING.h b/src/codec_utils/E2SMKPM/OCTET_STRING.h new file mode 100644 index 000000000..c2f8baed1 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCTET_STRING.h @@ -0,0 +1,102 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _OCTET_STRING_H_ +#define _OCTET_STRING_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct OCTET_STRING { + uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ + size_t size; /* Size of the buffer */ + + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ +} OCTET_STRING_t; + +extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; +extern asn_TYPE_operation_t asn_OP_OCTET_STRING; + +asn_struct_free_f OCTET_STRING_free; +asn_struct_print_f OCTET_STRING_print; +asn_struct_print_f OCTET_STRING_print_utf8; +asn_struct_compare_f OCTET_STRING_compare; +ber_type_decoder_f OCTET_STRING_decode_ber; +der_type_encoder_f OCTET_STRING_encode_der; +xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ +xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ +xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ +xer_type_encoder_f OCTET_STRING_encode_xer; +xer_type_encoder_f OCTET_STRING_encode_xer_utf8; +oer_type_decoder_f OCTET_STRING_decode_oer; +oer_type_encoder_f OCTET_STRING_encode_oer; +per_type_decoder_f OCTET_STRING_decode_uper; +per_type_encoder_f OCTET_STRING_encode_uper; +per_type_decoder_f OCTET_STRING_decode_aper; +per_type_encoder_f OCTET_STRING_encode_aper; +asn_random_fill_f OCTET_STRING_random_fill; + +#define OCTET_STRING_constraint asn_generic_no_constraint +#define OCTET_STRING_decode_xer OCTET_STRING_decode_xer_hex + +/****************************** + * Handy conversion routines. * + ******************************/ + +/* + * This function clears the previous value of the OCTET STRING (if any) + * and then allocates a new memory with the specified content (str/size). + * If size = -1, the size of the original string will be determined + * using strlen(str). + * If str equals to NULL, the function will silently clear the + * current contents of the OCTET STRING. + * Returns 0 if it was possible to perform operation, -1 otherwise. + */ +int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); + +/* Handy conversion from the C string into the OCTET STRING. */ +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1) + +/* + * Allocate and fill the new OCTET STRING and return a pointer to the newly + * allocated object. NULL is permitted in str: the function will just allocate + * empty OCTET STRING. + */ +OCTET_STRING_t *OCTET_STRING_new_fromBuf(const asn_TYPE_descriptor_t *td, + const char *str, int size); + +/**************************** + * Internally useful stuff. * + ****************************/ + +typedef struct asn_OCTET_STRING_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the structure */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + enum asn_OS_Subvariant { + ASN_OSUBV_ANY, /* The open type (ANY) */ + ASN_OSUBV_BIT, /* BIT STRING */ + ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */ + ASN_OSUBV_U16, /* 16-bit character (BMPString) */ + ASN_OSUBV_U32 /* 32-bit character (UniversalString) */ + } subvariant; +} asn_OCTET_STRING_specifics_t; + +extern asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs; + +size_t OCTET_STRING_random_length_constrained( + const asn_TYPE_descriptor_t *, const asn_encoding_constraints_t *, + size_t max_length); + +#ifdef __cplusplus +} +#endif + +#endif /* _OCTET_STRING_H_ */ diff --git a/src/codec_utils/E2SMKPM/OCTET_STRING_oer.c b/src/codec_utils/E2SMKPM/OCTET_STRING_oer.c new file mode 100644 index 000000000..c16faeafb --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCTET_STRING_oer.c @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +OCTET_STRING_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **sptr, + const void *ptr, size_t size) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; + const asn_oer_constraints_t *cts = + constraints ? constraints : td->encoding_constraints.oer_constraints; + ssize_t ct_size = cts ? cts->size : -1; + asn_dec_rval_t rval = {RC_OK, 0}; + size_t expected_length = 0; + + size_t unit_bytes; + switch(specs->subvariant) { + default: + case ASN_OSUBV_BIT: + ASN_DEBUG("Invalid use of OCTET STRING to decode BIT STRING"); + ASN__DECODE_FAILED; + case ASN_OSUBV_ANY: + /* Fall through */ + case ASN_OSUBV_STR: + unit_bytes = 1; + break; + case ASN_OSUBV_U16: + unit_bytes = 2; + break; + case ASN_OSUBV_U32: + unit_bytes = 4; + break; + } + + (void)opt_codec_ctx; + + if(!st) { + st = (OCTET_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) ASN__DECODE_FAILED; + } + + if(ct_size >= 0) { + expected_length = unit_bytes * ct_size; + } else { + /* + * X.696 (08/2015) #27.2 + * Encode length determinant as _number of octets_, but only + * if upper bound is not equal to lower bound. + */ + ssize_t len_len = oer_fetch_length(ptr, size, &expected_length); + if(len_len > 0) { + rval.consumed = len_len; + ptr = (const char *)ptr + len_len; + size -= len_len; + } else if(len_len == 0) { + ASN__DECODE_STARVED; + } else if(len_len < 0) { + ASN__DECODE_FAILED; + } + + if(expected_length % unit_bytes != 0) { + ASN_DEBUG( + "Data size %" ASN_PRI_SIZE " bytes is not consistent with multiplier %" ASN_PRI_SIZE "", + expected_length, unit_bytes); + ASN__DECODE_FAILED; + } + } + + if(size < expected_length) { + ASN__DECODE_STARVED; + } else { + uint8_t *buf = MALLOC(expected_length + 1); + if(buf == NULL) { + ASN__DECODE_FAILED; + } else { + memcpy(buf, ptr, expected_length); + buf[expected_length] = '\0'; + } + FREEMEM(st->buf); + st->buf = buf; + st->size = expected_length; + + rval.consumed += expected_length; + return rval; + } +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +OCTET_STRING_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_OCTET_STRING_specifics_t *specs = + td->specifics ? (const asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_SPC_OCTET_STRING_specs; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + const asn_oer_constraints_t *cts = + constraints ? constraints : td->encoding_constraints.oer_constraints; + ssize_t ct_size = cts ? cts->size : -1; + asn_enc_rval_t er = {0, 0, 0}; + + if(!st) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s %" ASN_PRI_SIZE " as OCTET STRING", td ? td->name : "", st->size); + + if(ct_size >= 0) { + /* + * Check that available data matches the constraint + */ + size_t unit_bytes; + switch(specs->subvariant) { + default: + case ASN_OSUBV_BIT: + ASN_DEBUG("Invalid use of OCTET STRING to encode BIT STRING"); + ASN__ENCODE_FAILED; + case ASN_OSUBV_ANY: + /* Fall through */ + case ASN_OSUBV_STR: + unit_bytes = 1; + break; + case ASN_OSUBV_U16: + unit_bytes = 2; + break; + case ASN_OSUBV_U32: + unit_bytes = 4; + break; + } + + if(st->size != unit_bytes * (size_t)ct_size) { + ASN_DEBUG( + "Trying to encode %s (%" ASN_PRI_SIZE " bytes) which doesn't fit SIZE " + "constraint (%" ASN_PRI_SIZE ")", + td->name, st->size, ct_size); + ASN__ENCODE_FAILED; + } + } else { + /* + * X.696 (08/2015) #27.2 + * Encode length determinant as _number of octets_, but only + * if upper bound is not equal to lower bound. + */ + ssize_t ret = oer_serialize_length(st->size, cb, app_key); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + er.encoded += ret; + } + + er.encoded += st->size; + if(cb(st->buf, st->size, app_key) < 0) { + ASN__ENCODE_FAILED; + } else { + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/OCUCP-PF-Container.c b/src/codec_utils/E2SMKPM/OCUCP-PF-Container.c new file mode 100644 index 000000000..bd76aa557 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCUCP-PF-Container.c @@ -0,0 +1,140 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "OCUCP-PF-Container.h" + +static int +memb_numberOfActive_UEs_constraint_3(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 1 && value <= 65536)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_numberOfActive_UEs_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_numberOfActive_UEs_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 16, -1, 1, 65536 } /* (1..65536,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_cu_CP_Resource_Status_3[] = { + { ATF_POINTER, 1, offsetof(struct OCUCP_PF_Container__cu_CP_Resource_Status, numberOfActive_UEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_numberOfActive_UEs_constr_4, &asn_PER_memb_numberOfActive_UEs_constr_4, memb_numberOfActive_UEs_constraint_3 }, + 0, 0, /* No default value */ + "numberOfActive-UEs" + }, +}; +static const int asn_MAP_cu_CP_Resource_Status_oms_3[] = { 0 }; +static const ber_tlv_tag_t asn_DEF_cu_CP_Resource_Status_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_cu_CP_Resource_Status_tag2el_3[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* numberOfActive-UEs */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_cu_CP_Resource_Status_specs_3 = { + sizeof(struct OCUCP_PF_Container__cu_CP_Resource_Status), + offsetof(struct OCUCP_PF_Container__cu_CP_Resource_Status, _asn_ctx), + asn_MAP_cu_CP_Resource_Status_tag2el_3, + 1, /* Count of tags in the map */ + asn_MAP_cu_CP_Resource_Status_oms_3, /* Optional members */ + 1, 0, /* Root/Additions */ + -1, /* First extension addition */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_cu_CP_Resource_Status_3 = { + "cu-CP-Resource-Status", + "cu-CP-Resource-Status", + &asn_OP_SEQUENCE, + asn_DEF_cu_CP_Resource_Status_tags_3, + sizeof(asn_DEF_cu_CP_Resource_Status_tags_3) + /sizeof(asn_DEF_cu_CP_Resource_Status_tags_3[0]) - 1, /* 1 */ + asn_DEF_cu_CP_Resource_Status_tags_3, /* Same as above */ + sizeof(asn_DEF_cu_CP_Resource_Status_tags_3) + /sizeof(asn_DEF_cu_CP_Resource_Status_tags_3[0]), /* 2 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_cu_CP_Resource_Status_3, + 1, /* Elements count */ + &asn_SPC_cu_CP_Resource_Status_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_OCUCP_PF_Container_1[] = { + { ATF_POINTER, 1, offsetof(struct OCUCP_PF_Container, gNB_CU_CP_Name), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_CP_Name, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-CU-CP-Name" + }, + { ATF_NOFLAGS, 0, offsetof(struct OCUCP_PF_Container, cu_CP_Resource_Status), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_cu_CP_Resource_Status_3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cu-CP-Resource-Status" + }, +}; +static const int asn_MAP_OCUCP_PF_Container_oms_1[] = { 0 }; +static const ber_tlv_tag_t asn_DEF_OCUCP_PF_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_OCUCP_PF_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB-CU-CP-Name */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cu-CP-Resource-Status */ +}; +asn_SEQUENCE_specifics_t asn_SPC_OCUCP_PF_Container_specs_1 = { + sizeof(struct OCUCP_PF_Container), + offsetof(struct OCUCP_PF_Container, _asn_ctx), + asn_MAP_OCUCP_PF_Container_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_OCUCP_PF_Container_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_OCUCP_PF_Container = { + "OCUCP-PF-Container", + "OCUCP-PF-Container", + &asn_OP_SEQUENCE, + asn_DEF_OCUCP_PF_Container_tags_1, + sizeof(asn_DEF_OCUCP_PF_Container_tags_1) + /sizeof(asn_DEF_OCUCP_PF_Container_tags_1[0]), /* 1 */ + asn_DEF_OCUCP_PF_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_OCUCP_PF_Container_tags_1) + /sizeof(asn_DEF_OCUCP_PF_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_OCUCP_PF_Container_1, + 2, /* Elements count */ + &asn_SPC_OCUCP_PF_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/OCUCP-PF-Container.h b/src/codec_utils/E2SMKPM/OCUCP-PF-Container.h new file mode 100644 index 000000000..f68d3c272 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCUCP-PF-Container.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _OCUCP_PF_Container_H_ +#define _OCUCP_PF_Container_H_ + + +#include + +/* Including external dependencies */ +#include "GNB-CU-CP-Name.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* OCUCP-PF-Container */ +typedef struct OCUCP_PF_Container { + GNB_CU_CP_Name_t *gNB_CU_CP_Name; /* OPTIONAL */ + struct OCUCP_PF_Container__cu_CP_Resource_Status { + long *numberOfActive_UEs; /* OPTIONAL */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } cu_CP_Resource_Status; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} OCUCP_PF_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_OCUCP_PF_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_OCUCP_PF_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_OCUCP_PF_Container_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _OCUCP_PF_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/OCUUP-PF-Container.c b/src/codec_utils/E2SMKPM/OCUUP-PF-Container.c new file mode 100644 index 000000000..e231f86d8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCUUP-PF-Container.c @@ -0,0 +1,142 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "OCUUP-PF-Container.h" + +#include "PF-ContainerListItem.h" +static int +memb_pf_ContainerList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 3)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_pf_ContainerList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..3)) */}; +static asn_per_constraints_t asn_PER_type_pf_ContainerList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pf_ContainerList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..3)) */}; +static asn_per_constraints_t asn_PER_memb_pf_ContainerList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 2, 2, 1, 3 } /* (SIZE(1..3)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_pf_ContainerList_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_PF_ContainerListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_pf_ContainerList_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_pf_ContainerList_specs_3 = { + sizeof(struct OCUUP_PF_Container__pf_ContainerList), + offsetof(struct OCUUP_PF_Container__pf_ContainerList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_pf_ContainerList_3 = { + "pf-ContainerList", + "pf-ContainerList", + &asn_OP_SEQUENCE_OF, + asn_DEF_pf_ContainerList_tags_3, + sizeof(asn_DEF_pf_ContainerList_tags_3) + /sizeof(asn_DEF_pf_ContainerList_tags_3[0]) - 1, /* 1 */ + asn_DEF_pf_ContainerList_tags_3, /* Same as above */ + sizeof(asn_DEF_pf_ContainerList_tags_3) + /sizeof(asn_DEF_pf_ContainerList_tags_3[0]), /* 2 */ + { &asn_OER_type_pf_ContainerList_constr_3, &asn_PER_type_pf_ContainerList_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_pf_ContainerList_3, + 1, /* Single element */ + &asn_SPC_pf_ContainerList_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_OCUUP_PF_Container_1[] = { + { ATF_POINTER, 1, offsetof(struct OCUUP_PF_Container, gNB_CU_UP_Name), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_Name, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-CU-UP-Name" + }, + { ATF_NOFLAGS, 0, offsetof(struct OCUUP_PF_Container, pf_ContainerList), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_pf_ContainerList_3, + 0, + { &asn_OER_memb_pf_ContainerList_constr_3, &asn_PER_memb_pf_ContainerList_constr_3, memb_pf_ContainerList_constraint_1 }, + 0, 0, /* No default value */ + "pf-ContainerList" + }, +}; +static const int asn_MAP_OCUUP_PF_Container_oms_1[] = { 0 }; +static const ber_tlv_tag_t asn_DEF_OCUUP_PF_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_OCUUP_PF_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB-CU-UP-Name */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* pf-ContainerList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_OCUUP_PF_Container_specs_1 = { + sizeof(struct OCUUP_PF_Container), + offsetof(struct OCUUP_PF_Container, _asn_ctx), + asn_MAP_OCUUP_PF_Container_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_OCUUP_PF_Container_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_OCUUP_PF_Container = { + "OCUUP-PF-Container", + "OCUUP-PF-Container", + &asn_OP_SEQUENCE, + asn_DEF_OCUUP_PF_Container_tags_1, + sizeof(asn_DEF_OCUUP_PF_Container_tags_1) + /sizeof(asn_DEF_OCUUP_PF_Container_tags_1[0]), /* 1 */ + asn_DEF_OCUUP_PF_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_OCUUP_PF_Container_tags_1) + /sizeof(asn_DEF_OCUUP_PF_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_OCUUP_PF_Container_1, + 2, /* Elements count */ + &asn_SPC_OCUUP_PF_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/OCUUP-PF-Container.h b/src/codec_utils/E2SMKPM/OCUUP-PF-Container.h new file mode 100644 index 000000000..02e6bd85e --- /dev/null +++ b/src/codec_utils/E2SMKPM/OCUUP-PF-Container.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _OCUUP_PF_Container_H_ +#define _OCUUP_PF_Container_H_ + + +#include + +/* Including external dependencies */ +#include "GNB-CU-UP-Name.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PF_ContainerListItem; + +/* OCUUP-PF-Container */ +typedef struct OCUUP_PF_Container { + GNB_CU_UP_Name_t *gNB_CU_UP_Name; /* OPTIONAL */ + struct OCUUP_PF_Container__pf_ContainerList { + A_SEQUENCE_OF(struct PF_ContainerListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } pf_ContainerList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} OCUUP_PF_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_OCUUP_PF_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_OCUUP_PF_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_OCUUP_PF_Container_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _OCUUP_PF_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/ODU-PF-Container.c b/src/codec_utils/E2SMKPM/ODU-PF-Container.c new file mode 100644 index 000000000..e1b182772 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ODU-PF-Container.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ODU-PF-Container.h" + +#include "CellResourceReportListItem.h" +static int +memb_cellResourceReportList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 512)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_cellResourceReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..512)) */}; +static asn_per_constraints_t asn_PER_type_cellResourceReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 1, 512 } /* (SIZE(1..512)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_cellResourceReportList_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..512)) */}; +static asn_per_constraints_t asn_PER_memb_cellResourceReportList_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 1, 512 } /* (SIZE(1..512)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_cellResourceReportList_2[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CellResourceReportListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_cellResourceReportList_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_cellResourceReportList_specs_2 = { + sizeof(struct ODU_PF_Container__cellResourceReportList), + offsetof(struct ODU_PF_Container__cellResourceReportList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_cellResourceReportList_2 = { + "cellResourceReportList", + "cellResourceReportList", + &asn_OP_SEQUENCE_OF, + asn_DEF_cellResourceReportList_tags_2, + sizeof(asn_DEF_cellResourceReportList_tags_2) + /sizeof(asn_DEF_cellResourceReportList_tags_2[0]) - 1, /* 1 */ + asn_DEF_cellResourceReportList_tags_2, /* Same as above */ + sizeof(asn_DEF_cellResourceReportList_tags_2) + /sizeof(asn_DEF_cellResourceReportList_tags_2[0]), /* 2 */ + { &asn_OER_type_cellResourceReportList_constr_2, &asn_PER_type_cellResourceReportList_constr_2, SEQUENCE_OF_constraint }, + asn_MBR_cellResourceReportList_2, + 1, /* Single element */ + &asn_SPC_cellResourceReportList_specs_2 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ODU_PF_Container_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ODU_PF_Container, cellResourceReportList), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_cellResourceReportList_2, + 0, + { &asn_OER_memb_cellResourceReportList_constr_2, &asn_PER_memb_cellResourceReportList_constr_2, memb_cellResourceReportList_constraint_1 }, + 0, 0, /* No default value */ + "cellResourceReportList" + }, +}; +static const ber_tlv_tag_t asn_DEF_ODU_PF_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ODU_PF_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cellResourceReportList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ODU_PF_Container_specs_1 = { + sizeof(struct ODU_PF_Container), + offsetof(struct ODU_PF_Container, _asn_ctx), + asn_MAP_ODU_PF_Container_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ODU_PF_Container = { + "ODU-PF-Container", + "ODU-PF-Container", + &asn_OP_SEQUENCE, + asn_DEF_ODU_PF_Container_tags_1, + sizeof(asn_DEF_ODU_PF_Container_tags_1) + /sizeof(asn_DEF_ODU_PF_Container_tags_1[0]), /* 1 */ + asn_DEF_ODU_PF_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_ODU_PF_Container_tags_1) + /sizeof(asn_DEF_ODU_PF_Container_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ODU_PF_Container_1, + 1, /* Elements count */ + &asn_SPC_ODU_PF_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/ODU-PF-Container.h b/src/codec_utils/E2SMKPM/ODU-PF-Container.h new file mode 100644 index 000000000..8ff2e07de --- /dev/null +++ b/src/codec_utils/E2SMKPM/ODU-PF-Container.h @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ODU_PF_Container_H_ +#define _ODU_PF_Container_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct CellResourceReportListItem; + +/* ODU-PF-Container */ +typedef struct ODU_PF_Container { + struct ODU_PF_Container__cellResourceReportList { + A_SEQUENCE_OF(struct CellResourceReportListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } cellResourceReportList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ODU_PF_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ODU_PF_Container; +extern asn_SEQUENCE_specifics_t asn_SPC_ODU_PF_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_ODU_PF_Container_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ODU_PF_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/OPEN_TYPE.c b/src/codec_utils/E2SMKPM/OPEN_TYPE.c new file mode 100644 index 000000000..a54e99c3c --- /dev/null +++ b/src/codec_utils/E2SMKPM/OPEN_TYPE.c @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include +#include + +asn_TYPE_operation_t asn_OP_OPEN_TYPE = { + OPEN_TYPE_free, + OPEN_TYPE_print, + OPEN_TYPE_compare, + OPEN_TYPE_decode_ber, + OPEN_TYPE_encode_der, + OPEN_TYPE_decode_xer, + OPEN_TYPE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, 0, /* No OER support, use "-gen-OER" to enable */ +#else + OPEN_TYPE_decode_oer, + OPEN_TYPE_encode_oer, +#endif +#ifdef ASN_DISABLE_PER_SUPPORT + 0, 0, 0, 0, +#else + OPEN_TYPE_decode_uper, + OPEN_TYPE_encode_uper, + OPEN_TYPE_decode_aper, + OPEN_TYPE_encode_aper, +#endif + 0, /* Random fill is not supported for open type */ + 0 /* Use generic outmost tag fetcher */ +}; + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +asn_dec_rval_t +OPEN_TYPE_ber_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void *sptr, + const asn_TYPE_member_t *elm, const void *ptr, size_t size) { + size_t consumed_myself = 0; + asn_type_selector_result_t selected; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *inner_value; + asn_dec_rval_t rv; + + if(!(elm->flags & ATF_OPEN_TYPE)) { + ASN__DECODE_FAILED; + } + + if(!elm->type_selector) { + ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s", + td->name, elm->name, elm->type->name); + ASN__DECODE_FAILED; + } + + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + ASN__DECODE_FAILED; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + if(*memb_ptr2 != NULL) { + /* Make sure we reset the structure first before encoding */ + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0) != 0) { + ASN__DECODE_FAILED; + } + } + + inner_value = + (char *)*memb_ptr2 + + elm->type->elements[selected.presence_index - 1].memb_offset; + + ASN_DEBUG("presence %d\n", selected.presence_index); + + rv = selected.type_descriptor->op->ber_decoder( + opt_codec_ctx, selected.type_descriptor, &inner_value, ptr, size, + elm->tag_mode); + ADVANCE(rv.consumed); + rv.consumed = 0; + switch(rv.code) { + case RC_OK: + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, + selected.presence_index) + == 0) { + rv.code = RC_OK; + rv.consumed = consumed_myself; + return rv; + } else { + /* Oh, now a full-blown failure failure */ + } + /* Fall through */ + case RC_FAIL: + rv.consumed = consumed_myself; + /* Fall through */ + case RC_WMORE: + break; + } + + if(*memb_ptr2) { + if(elm->flags & ATF_POINTER) { + ASN_STRUCT_FREE(*selected.type_descriptor, inner_value); + *memb_ptr2 = NULL; + } else { + ASN_STRUCT_RESET(*selected.type_descriptor, + inner_value); + } + } + return rv; +} + +asn_dec_rval_t +OPEN_TYPE_xer_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void *sptr, + const asn_TYPE_member_t *elm, const void *ptr, size_t size) { + size_t consumed_myself = 0; + asn_type_selector_result_t selected; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *inner_value; + asn_dec_rval_t rv; + + int xer_context = 0; + ssize_t ch_size; + pxer_chunk_type_e ch_type; + + if(!(elm->flags & ATF_OPEN_TYPE)) { + ASN__DECODE_FAILED; + } + + if(!elm->type_selector) { + ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s", + td->name, elm->name, elm->type->name); + ASN__DECODE_FAILED; + } + + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + ASN__DECODE_FAILED; + } + + /* Fetch the pointer to this member */ + assert(elm->flags == ATF_OPEN_TYPE); + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + if(*memb_ptr2 != NULL) { + /* Make sure we reset the structure first before encoding */ + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0) + != 0) { + ASN__DECODE_FAILED; + } + } + + /* + * Confirm wrapper. + */ + for(;;) { + ch_size = xer_next_token(&xer_context, ptr, size, &ch_type); + if(ch_size < 0) { + ASN__DECODE_FAILED; + } else { + switch(ch_type) { + case PXER_WMORE: + ASN__DECODE_STARVED; + case PXER_COMMENT: + case PXER_TEXT: + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; + } + break; + } + } + + /* + * Wrapper value confirmed. + */ + switch(xer_check_tag(ptr, ch_size, elm->name)) { + case XCT_OPENING: + ADVANCE(ch_size); + break; + case XCT_BROKEN: + default: + ASN__DECODE_FAILED; + } + + inner_value = + (char *)*memb_ptr2 + + elm->type->elements[selected.presence_index - 1].memb_offset; + + rv = selected.type_descriptor->op->xer_decoder( + opt_codec_ctx, selected.type_descriptor, &inner_value, NULL, ptr, size); + ADVANCE(rv.consumed); + rv.consumed = 0; + switch(rv.code) { + case RC_OK: + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, + selected.presence_index) + == 0) { + break; + } else { + rv.code = RC_FAIL; + } + /* Fall through */ + case RC_FAIL: + /* Point to a best position where failure occurred */ + rv.consumed = consumed_myself; + /* Fall through */ + case RC_WMORE: + /* Wrt. rv.consumed==0: + * In case a genuine RC_WMORE, the whole Open Type decoding + * will have to be restarted. + */ + if(*memb_ptr2) { + if(elm->flags & ATF_POINTER) { + ASN_STRUCT_FREE(*selected.type_descriptor, inner_value); + *memb_ptr2 = NULL; + } else { + ASN_STRUCT_RESET(*selected.type_descriptor, + inner_value); + } + } + return rv; + } + + /* + * Finalize wrapper. + */ + for(;;) { + ch_size = xer_next_token(&xer_context, ptr, size, &ch_type); + if(ch_size < 0) { + ASN__DECODE_FAILED; + } else { + switch(ch_type) { + case PXER_WMORE: + ASN__DECODE_STARVED; + case PXER_COMMENT: + case PXER_TEXT: + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; + } + break; + } + } + + /* + * Wrapper value confirmed. + */ + switch(xer_check_tag(ptr, ch_size, elm->name)) { + case XCT_CLOSING: + ADVANCE(ch_size); + break; + case XCT_BROKEN: + default: + ASN__DECODE_FAILED; + } + + rv.consumed += consumed_myself; + + return rv; +} + + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +OPEN_TYPE_uper_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void *sptr, + const asn_TYPE_member_t *elm, asn_per_data_t *pd) { + asn_type_selector_result_t selected; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *inner_value; + asn_dec_rval_t rv; + + if(!(elm->flags & ATF_OPEN_TYPE)) { + ASN__DECODE_FAILED; + } + + if(!elm->type_selector) { + ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s", + td->name, elm->name, elm->type->name); + ASN__DECODE_FAILED; + } + + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + ASN__DECODE_FAILED; + } + + /* Fetch the pointer to this member */ + assert(elm->flags == ATF_OPEN_TYPE); + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + if(*memb_ptr2 != NULL) { + /* Make sure we reset the structure first before encoding */ + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0) + != 0) { + ASN__DECODE_FAILED; + } + } + + inner_value = + (char *)*memb_ptr2 + + elm->type->elements[selected.presence_index - 1].memb_offset; + + rv = uper_open_type_get(opt_codec_ctx, selected.type_descriptor, NULL, + &inner_value, pd); + switch(rv.code) { + case RC_OK: + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, + selected.presence_index) + == 0) { + break; + } else { + rv.code = RC_FAIL; + } + /* Fall through */ + case RC_WMORE: + case RC_FAIL: + if(*memb_ptr2) { + if(elm->flags & ATF_POINTER) { + ASN_STRUCT_FREE(*selected.type_descriptor, inner_value); + *memb_ptr2 = NULL; + } else { + ASN_STRUCT_RESET(*selected.type_descriptor, + inner_value); + } + } + } + return rv; +} + +asn_enc_rval_t +OPEN_TYPE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const void *memb_ptr; /* Pointer to the member */ + asn_TYPE_member_t *elm; /* CHOICE's element */ + asn_enc_rval_t er = {0,0,0}; + unsigned present; + + (void)constraints; + + present = CHOICE_variant_get_presence(td, sptr); + if(present == 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + present--; + } + + ASN_DEBUG("Encoding %s OPEN TYPE element %d", td->name, present); + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(uper_open_type_put(elm->type, NULL, memb_ptr, po) < 0) { + ASN__ENCODE_FAILED; + } + + er.encoded = 0; + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +OPEN_TYPE_aper_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void *sptr, + const asn_TYPE_member_t *elm, asn_per_data_t *pd) { + asn_type_selector_result_t selected; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *inner_value; + asn_dec_rval_t rv; + + if(!(elm->flags & ATF_OPEN_TYPE)) { + ASN__DECODE_FAILED; + } + + if(!elm->type_selector) { + ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s", + td->name, elm->name, elm->type->name); + ASN__DECODE_FAILED; + } + + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + ASN__DECODE_FAILED; + } + + /* Fetch the pointer to this member */ + assert(elm->flags == ATF_OPEN_TYPE); + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + if(*memb_ptr2 != NULL) { + /* Make sure we reset the structure first before encoding */ + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0) + != 0) { + ASN__DECODE_FAILED; + } + } + + inner_value = + (char *)*memb_ptr2 + + elm->type->elements[selected.presence_index - 1].memb_offset; + + rv = aper_open_type_get(opt_codec_ctx, selected.type_descriptor, NULL, + &inner_value, pd); + switch(rv.code) { + case RC_OK: + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, + selected.presence_index) + == 0) { + break; + } else { + rv.code = RC_FAIL; + } + /* Fall through */ + case RC_WMORE: + case RC_FAIL: + if(*memb_ptr2) { + if(elm->flags & ATF_POINTER) { + ASN_STRUCT_FREE(*selected.type_descriptor, inner_value); + *memb_ptr2 = NULL; + } else { + ASN_STRUCT_RESET(*selected.type_descriptor, + inner_value); + } + } + } + return rv; +} + +asn_enc_rval_t +OPEN_TYPE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const void *memb_ptr; /* Pointer to the member */ + asn_TYPE_member_t *elm; /* CHOICE's element */ + asn_enc_rval_t er = {0,0,0}; + unsigned present; + + (void)constraints; + + present = CHOICE_variant_get_presence(td, sptr); + if(present == 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + present--; + } + + ASN_DEBUG("Encoding %s OPEN TYPE element %d", td->name, present); + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(aper_open_type_put(elm->type, NULL, memb_ptr, po) < 0) { + ASN__ENCODE_FAILED; + } + + er.encoded = 0; + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/OPEN_TYPE.h b/src/codec_utils/E2SMKPM/OPEN_TYPE.h new file mode 100644 index 000000000..b0d023c1f --- /dev/null +++ b/src/codec_utils/E2SMKPM/OPEN_TYPE.h @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2017-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_OPEN_TYPE_H +#define ASN_OPEN_TYPE_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OPEN_TYPE_free CHOICE_free +#define OPEN_TYPE_print CHOICE_print +#define OPEN_TYPE_compare CHOICE_compare +#define OPEN_TYPE_constraint CHOICE_constraint +#define OPEN_TYPE_decode_ber NULL +#define OPEN_TYPE_encode_der CHOICE_encode_der +#define OPEN_TYPE_decode_xer NULL +#define OPEN_TYPE_encode_xer CHOICE_encode_xer +#define OPEN_TYPE_decode_oer NULL +#define OPEN_TYPE_encode_oer CHOICE_encode_oer +#define OPEN_TYPE_decode_uper NULL +#define OPEN_TYPE_decode_aper NULL + +extern asn_TYPE_operation_t asn_OP_OPEN_TYPE; + +/* + * Decode an Open Type which is potentially constraiend + * by the other members of the parent structure. + */ +asn_dec_rval_t OPEN_TYPE_ber_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + const asn_TYPE_member_t *element, + const void *ptr, size_t size); + +asn_dec_rval_t OPEN_TYPE_xer_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + const asn_TYPE_member_t *element, + const void *ptr, size_t size); + +asn_dec_rval_t OPEN_TYPE_oer_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + asn_TYPE_member_t *element, const void *ptr, + size_t size); + +asn_dec_rval_t OPEN_TYPE_uper_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + const asn_TYPE_member_t *element, + asn_per_data_t *pd); + +asn_dec_rval_t OPEN_TYPE_aper_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *parent_type, + void *parent_structure, + const asn_TYPE_member_t *element, + asn_per_data_t *pd); + +asn_enc_rval_t OPEN_TYPE_encode_uper( + const asn_TYPE_descriptor_t *type_descriptor, + const asn_per_constraints_t *constraints, const void *struct_ptr, + asn_per_outp_t *per_output); + +asn_enc_rval_t OPEN_TYPE_encode_aper( + const asn_TYPE_descriptor_t *type_descriptor, + const asn_per_constraints_t *constraints, const void *struct_ptr, + asn_per_outp_t *per_output); + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_OPEN_TYPE_H */ diff --git a/src/codec_utils/E2SMKPM/OPEN_TYPE_oer.c b/src/codec_utils/E2SMKPM/OPEN_TYPE_oer.c new file mode 100644 index 000000000..dd2f5c644 --- /dev/null +++ b/src/codec_utils/E2SMKPM/OPEN_TYPE_oer.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +asn_dec_rval_t +OPEN_TYPE_oer_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void *sptr, + asn_TYPE_member_t *elm, const void *ptr, size_t size) { + asn_type_selector_result_t selected; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *inner_value; + asn_dec_rval_t rv; + size_t ot_ret; + + + if(!(elm->flags & ATF_OPEN_TYPE)) { + ASN__DECODE_FAILED; + } + + if(!elm->type_selector) { + ASN_DEBUG("Type selector is not defined for Open Type %s->%s->%s", + td->name, elm->name, elm->type->name); + ASN__DECODE_FAILED; + } + + selected = elm->type_selector(td, sptr); + if(!selected.presence_index) { + ASN__DECODE_FAILED; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + if(*memb_ptr2 != NULL) { + /* Make sure we reset the structure first before encoding */ + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, 0) != 0) { + ASN__DECODE_FAILED; + } + } + + inner_value = + (char *)*memb_ptr2 + + elm->type->elements[selected.presence_index - 1].memb_offset; + + ot_ret = oer_open_type_get(opt_codec_ctx, selected.type_descriptor, NULL, + &inner_value, ptr, size); + switch(ot_ret) { + default: + if(CHOICE_variant_set_presence(elm->type, *memb_ptr2, + selected.presence_index) + == 0) { + rv.code = RC_OK; + rv.consumed = ot_ret; + return rv; + } else { + /* Oh, now a full-blown failure failure */ + } + /* Fall through */ + case -1: + rv.code = RC_FAIL; + rv.consumed = ot_ret; + break; + case 0: + rv.code = RC_WMORE; + rv.consumed = 0; + break; + } + + if(*memb_ptr2) { + const asn_CHOICE_specifics_t *specs = + selected.type_descriptor->specifics; + if(elm->flags & ATF_POINTER) { + ASN_STRUCT_FREE(*selected.type_descriptor, inner_value); + *memb_ptr2 = NULL; + } else { + ASN_STRUCT_FREE_CONTENTS_ONLY(*selected.type_descriptor, + inner_value); + memset(*memb_ptr2, 0, specs->struct_size); + } + } + return rv; +} diff --git a/src/codec_utils/E2SMKPM/PF-Container.c b/src/codec_utils/E2SMKPM/PF-Container.c new file mode 100644 index 000000000..d93ce4fba --- /dev/null +++ b/src/codec_utils/E2SMKPM/PF-Container.c @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PF-Container.h" + +#include "ODU-PF-Container.h" +#include "OCUCP-PF-Container.h" +#include "OCUUP-PF-Container.h" +static asn_oer_constraints_t asn_OER_type_PF_Container_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_PF_Container_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_PF_Container_1[] = { + { ATF_POINTER, 0, offsetof(struct PF_Container, choice.oDU), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ODU_PF_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "oDU" + }, + { ATF_POINTER, 0, offsetof(struct PF_Container, choice.oCU_CP), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCUCP_PF_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "oCU-CP" + }, + { ATF_POINTER, 0, offsetof(struct PF_Container, choice.oCU_UP), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCUUP_PF_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "oCU-UP" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_PF_Container_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* oDU */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* oCU-CP */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* oCU-UP */ +}; +asn_CHOICE_specifics_t asn_SPC_PF_Container_specs_1 = { + sizeof(struct PF_Container), + offsetof(struct PF_Container, _asn_ctx), + offsetof(struct PF_Container, present), + sizeof(((struct PF_Container *)0)->present), + asn_MAP_PF_Container_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_PF_Container = { + "PF-Container", + "PF-Container", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_PF_Container_constr_1, &asn_PER_type_PF_Container_constr_1, CHOICE_constraint }, + asn_MBR_PF_Container_1, + 3, /* Elements count */ + &asn_SPC_PF_Container_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PF-Container.h b/src/codec_utils/E2SMKPM/PF-Container.h new file mode 100644 index 000000000..755fb380f --- /dev/null +++ b/src/codec_utils/E2SMKPM/PF-Container.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PF_Container_H_ +#define _PF_Container_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum PF_Container_PR { + PF_Container_PR_NOTHING, /* No components present */ + PF_Container_PR_oDU, + PF_Container_PR_oCU_CP, + PF_Container_PR_oCU_UP +} PF_Container_PR; + +/* Forward declarations */ +struct ODU_PF_Container; +struct OCUCP_PF_Container; +struct OCUUP_PF_Container; + +/* PF-Container */ +typedef struct PF_Container { + PF_Container_PR present; + union PF_Container_u { + struct ODU_PF_Container *oDU; + struct OCUCP_PF_Container *oCU_CP; + struct OCUUP_PF_Container *oCU_UP; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PF_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PF_Container; +extern asn_CHOICE_specifics_t asn_SPC_PF_Container_specs_1; +extern asn_TYPE_member_t asn_MBR_PF_Container_1[3]; +extern asn_per_constraints_t asn_PER_type_PF_Container_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _PF_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PF-ContainerListItem.c b/src/codec_utils/E2SMKPM/PF-ContainerListItem.c new file mode 100644 index 000000000..65dd9f498 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PF-ContainerListItem.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PF-ContainerListItem.h" + +asn_TYPE_member_t asn_MBR_PF_ContainerListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PF_ContainerListItem, interface_type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NI_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "interface-type" + }, + { ATF_NOFLAGS, 0, offsetof(struct PF_ContainerListItem, o_CU_UP_PM_Container), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CUUPMeasurement_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "o-CU-UP-PM-Container" + }, +}; +static const ber_tlv_tag_t asn_DEF_PF_ContainerListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PF_ContainerListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface-type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* o-CU-UP-PM-Container */ +}; +asn_SEQUENCE_specifics_t asn_SPC_PF_ContainerListItem_specs_1 = { + sizeof(struct PF_ContainerListItem), + offsetof(struct PF_ContainerListItem, _asn_ctx), + asn_MAP_PF_ContainerListItem_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_PF_ContainerListItem = { + "PF-ContainerListItem", + "PF-ContainerListItem", + &asn_OP_SEQUENCE, + asn_DEF_PF_ContainerListItem_tags_1, + sizeof(asn_DEF_PF_ContainerListItem_tags_1) + /sizeof(asn_DEF_PF_ContainerListItem_tags_1[0]), /* 1 */ + asn_DEF_PF_ContainerListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_PF_ContainerListItem_tags_1) + /sizeof(asn_DEF_PF_ContainerListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_PF_ContainerListItem_1, + 2, /* Elements count */ + &asn_SPC_PF_ContainerListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PF-ContainerListItem.h b/src/codec_utils/E2SMKPM/PF-ContainerListItem.h new file mode 100644 index 000000000..e5480bf50 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PF-ContainerListItem.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PF_ContainerListItem_H_ +#define _PF_ContainerListItem_H_ + + +#include + +/* Including external dependencies */ +#include "NI-Type.h" +#include "CUUPMeasurement-Container.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PF-ContainerListItem */ +typedef struct PF_ContainerListItem { + NI_Type_t interface_type; + CUUPMeasurement_Container_t o_CU_UP_PM_Container; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PF_ContainerListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PF_ContainerListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_PF_ContainerListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_PF_ContainerListItem_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _PF_ContainerListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PLMN-Identity.c b/src/codec_utils/E2SMKPM/PLMN-Identity.c new file mode 100644 index 000000000..8a7df7b84 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PLMN-Identity.c @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PLMN-Identity.h" + +int +PLMN_Identity_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 3)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_PLMN_Identity_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 3, 3 } /* (SIZE(3..3)) */, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_PLMN_Identity_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_PLMN_Identity = { + "PLMN-Identity", + "PLMN-Identity", + &asn_OP_OCTET_STRING, + asn_DEF_PLMN_Identity_tags_1, + sizeof(asn_DEF_PLMN_Identity_tags_1) + /sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */ + asn_DEF_PLMN_Identity_tags_1, /* Same as above */ + sizeof(asn_DEF_PLMN_Identity_tags_1) + /sizeof(asn_DEF_PLMN_Identity_tags_1[0]), /* 1 */ + { &asn_OER_type_PLMN_Identity_constr_1, &asn_PER_type_PLMN_Identity_constr_1, PLMN_Identity_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PLMN-Identity.h b/src/codec_utils/E2SMKPM/PLMN-Identity.h new file mode 100644 index 000000000..52c889637 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PLMN-Identity.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PLMN_Identity_H_ +#define _PLMN_Identity_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PLMN-Identity */ +typedef OCTET_STRING_t PLMN_Identity_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_PLMN_Identity_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_PLMN_Identity; +asn_struct_free_f PLMN_Identity_free; +asn_struct_print_f PLMN_Identity_print; +asn_constr_check_f PLMN_Identity_constraint; +ber_type_decoder_f PLMN_Identity_decode_ber; +der_type_encoder_f PLMN_Identity_encode_der; +xer_type_decoder_f PLMN_Identity_decode_xer; +xer_type_encoder_f PLMN_Identity_encode_xer; +oer_type_decoder_f PLMN_Identity_decode_oer; +oer_type_encoder_f PLMN_Identity_encode_oer; +per_type_decoder_f PLMN_Identity_decode_uper; +per_type_encoder_f PLMN_Identity_encode_uper; +per_type_decoder_f PLMN_Identity_decode_aper; +per_type_encoder_f PLMN_Identity_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _PLMN_Identity_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PM-Containers-List.c b/src/codec_utils/E2SMKPM/PM-Containers-List.c new file mode 100644 index 000000000..371ff12ae --- /dev/null +++ b/src/codec_utils/E2SMKPM/PM-Containers-List.c @@ -0,0 +1,63 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PM-Containers-List.h" + +#include "PF-Container.h" +asn_TYPE_member_t asn_MBR_PM_Containers_List_1[] = { + { ATF_POINTER, 2, offsetof(struct PM_Containers_List, performanceContainer), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_PF_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "performanceContainer" + }, + { ATF_POINTER, 1, offsetof(struct PM_Containers_List, theRANContainer), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RAN_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "theRANContainer" + }, +}; +static const int asn_MAP_PM_Containers_List_oms_1[] = { 0, 1 }; +static const ber_tlv_tag_t asn_DEF_PM_Containers_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PM_Containers_List_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* performanceContainer */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* theRANContainer */ +}; +asn_SEQUENCE_specifics_t asn_SPC_PM_Containers_List_specs_1 = { + sizeof(struct PM_Containers_List), + offsetof(struct PM_Containers_List, _asn_ctx), + asn_MAP_PM_Containers_List_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_PM_Containers_List_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_PM_Containers_List = { + "PM-Containers-List", + "PM-Containers-List", + &asn_OP_SEQUENCE, + asn_DEF_PM_Containers_List_tags_1, + sizeof(asn_DEF_PM_Containers_List_tags_1) + /sizeof(asn_DEF_PM_Containers_List_tags_1[0]), /* 1 */ + asn_DEF_PM_Containers_List_tags_1, /* Same as above */ + sizeof(asn_DEF_PM_Containers_List_tags_1) + /sizeof(asn_DEF_PM_Containers_List_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_PM_Containers_List_1, + 2, /* Elements count */ + &asn_SPC_PM_Containers_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PM-Containers-List.h b/src/codec_utils/E2SMKPM/PM-Containers-List.h new file mode 100644 index 000000000..8edc2cd14 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PM-Containers-List.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PM_Containers_List_H_ +#define _PM_Containers_List_H_ + + +#include + +/* Including external dependencies */ +#include "RAN-Container.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct PF_Container; + +/* PM-Containers-List */ +typedef struct PM_Containers_List { + struct PF_Container *performanceContainer; /* OPTIONAL */ + RAN_Container_t *theRANContainer; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PM_Containers_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PM_Containers_List; +extern asn_SEQUENCE_specifics_t asn_SPC_PM_Containers_List_specs_1; +extern asn_TYPE_member_t asn_MBR_PM_Containers_List_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _PM_Containers_List_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PerQCIReportListItem.c b/src/codec_utils/E2SMKPM/PerQCIReportListItem.c new file mode 100644 index 000000000..936d88801 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PerQCIReportListItem.c @@ -0,0 +1,171 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PerQCIReportListItem.h" + +static int +memb_qci_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_dl_PRBUsage_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 100)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ul_PRBUsage_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 100)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_qci_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_qci_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_dl_PRBUsage_constr_3 CC_NOTUSED = { + { 1, 1 } /* (0..100) */, + -1}; +static asn_per_constraints_t asn_PER_memb_dl_PRBUsage_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 0, 100 } /* (0..100) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ul_PRBUsage_constr_4 CC_NOTUSED = { + { 1, 1 } /* (0..100) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ul_PRBUsage_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 0, 100 } /* (0..100) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_PerQCIReportListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PerQCIReportListItem, qci), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_qci_constr_2, &asn_PER_memb_qci_constr_2, memb_qci_constraint_1 }, + 0, 0, /* No default value */ + "qci" + }, + { ATF_POINTER, 2, offsetof(struct PerQCIReportListItem, dl_PRBUsage), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_dl_PRBUsage_constr_3, &asn_PER_memb_dl_PRBUsage_constr_3, memb_dl_PRBUsage_constraint_1 }, + 0, 0, /* No default value */ + "dl-PRBUsage" + }, + { ATF_POINTER, 1, offsetof(struct PerQCIReportListItem, ul_PRBUsage), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ul_PRBUsage_constr_4, &asn_PER_memb_ul_PRBUsage_constr_4, memb_ul_PRBUsage_constraint_1 }, + 0, 0, /* No default value */ + "ul-PRBUsage" + }, +}; +static const int asn_MAP_PerQCIReportListItem_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_PerQCIReportListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PerQCIReportListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* qci */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dl-PRBUsage */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ul-PRBUsage */ +}; +asn_SEQUENCE_specifics_t asn_SPC_PerQCIReportListItem_specs_1 = { + sizeof(struct PerQCIReportListItem), + offsetof(struct PerQCIReportListItem, _asn_ctx), + asn_MAP_PerQCIReportListItem_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_PerQCIReportListItem_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_PerQCIReportListItem = { + "PerQCIReportListItem", + "PerQCIReportListItem", + &asn_OP_SEQUENCE, + asn_DEF_PerQCIReportListItem_tags_1, + sizeof(asn_DEF_PerQCIReportListItem_tags_1) + /sizeof(asn_DEF_PerQCIReportListItem_tags_1[0]), /* 1 */ + asn_DEF_PerQCIReportListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_PerQCIReportListItem_tags_1) + /sizeof(asn_DEF_PerQCIReportListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_PerQCIReportListItem_1, + 3, /* Elements count */ + &asn_SPC_PerQCIReportListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PerQCIReportListItem.h b/src/codec_utils/E2SMKPM/PerQCIReportListItem.h new file mode 100644 index 000000000..cce692e72 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PerQCIReportListItem.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PerQCIReportListItem_H_ +#define _PerQCIReportListItem_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PerQCIReportListItem */ +typedef struct PerQCIReportListItem { + long qci; + long *dl_PRBUsage; /* OPTIONAL */ + long *ul_PRBUsage; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PerQCIReportListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PerQCIReportListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_PerQCIReportListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_PerQCIReportListItem_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _PerQCIReportListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.c b/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.c new file mode 100644 index 000000000..ae1a2efbc --- /dev/null +++ b/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.c @@ -0,0 +1,183 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PerQCIReportListItemFormat.h" + +static int +memb_qci_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_pDCPBytesDL_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 10000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_pDCPBytesUL_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 10000000000)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_qci_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_qci_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pDCPBytesDL_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_pDCPBytesDL_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 34, -1, 0, 10000000000 } /* (0..10000000000,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_pDCPBytesUL_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_pDCPBytesUL_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 34, -1, 0, 10000000000 } /* (0..10000000000,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_PerQCIReportListItemFormat_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PerQCIReportListItemFormat, qci), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_qci_constr_2, &asn_PER_memb_qci_constr_2, memb_qci_constraint_1 }, + 0, 0, /* No default value */ + "qci" + }, + { ATF_POINTER, 2, offsetof(struct PerQCIReportListItemFormat, pDCPBytesDL), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_INTEGER, + 0, + { &asn_OER_memb_pDCPBytesDL_constr_3, &asn_PER_memb_pDCPBytesDL_constr_3, memb_pDCPBytesDL_constraint_1 }, + 0, 0, /* No default value */ + "pDCPBytesDL" + }, + { ATF_POINTER, 1, offsetof(struct PerQCIReportListItemFormat, pDCPBytesUL), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_INTEGER, + 0, + { &asn_OER_memb_pDCPBytesUL_constr_4, &asn_PER_memb_pDCPBytesUL_constr_4, memb_pDCPBytesUL_constraint_1 }, + 0, 0, /* No default value */ + "pDCPBytesUL" + }, +}; +static const int asn_MAP_PerQCIReportListItemFormat_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_PerQCIReportListItemFormat_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PerQCIReportListItemFormat_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* qci */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pDCPBytesDL */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* pDCPBytesUL */ +}; +asn_SEQUENCE_specifics_t asn_SPC_PerQCIReportListItemFormat_specs_1 = { + sizeof(struct PerQCIReportListItemFormat), + offsetof(struct PerQCIReportListItemFormat, _asn_ctx), + asn_MAP_PerQCIReportListItemFormat_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_PerQCIReportListItemFormat_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_PerQCIReportListItemFormat = { + "PerQCIReportListItemFormat", + "PerQCIReportListItemFormat", + &asn_OP_SEQUENCE, + asn_DEF_PerQCIReportListItemFormat_tags_1, + sizeof(asn_DEF_PerQCIReportListItemFormat_tags_1) + /sizeof(asn_DEF_PerQCIReportListItemFormat_tags_1[0]), /* 1 */ + asn_DEF_PerQCIReportListItemFormat_tags_1, /* Same as above */ + sizeof(asn_DEF_PerQCIReportListItemFormat_tags_1) + /sizeof(asn_DEF_PerQCIReportListItemFormat_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_PerQCIReportListItemFormat_1, + 3, /* Elements count */ + &asn_SPC_PerQCIReportListItemFormat_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.h b/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.h new file mode 100644 index 000000000..add1a659e --- /dev/null +++ b/src/codec_utils/E2SMKPM/PerQCIReportListItemFormat.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PerQCIReportListItemFormat_H_ +#define _PerQCIReportListItemFormat_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PerQCIReportListItemFormat */ +typedef struct PerQCIReportListItemFormat { + long qci; + INTEGER_t *pDCPBytesDL; /* OPTIONAL */ + INTEGER_t *pDCPBytesUL; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PerQCIReportListItemFormat_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PerQCIReportListItemFormat; +extern asn_SEQUENCE_specifics_t asn_SPC_PerQCIReportListItemFormat_specs_1; +extern asn_TYPE_member_t asn_MBR_PerQCIReportListItemFormat_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _PerQCIReportListItemFormat_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PlmnID-List.c b/src/codec_utils/E2SMKPM/PlmnID-List.c new file mode 100644 index 000000000..c9a6c7764 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PlmnID-List.c @@ -0,0 +1,74 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PlmnID-List.h" + +#include "FGC-CUUP-PM-Format.h" +#include "EPC-CUUP-PM-Format.h" +asn_TYPE_member_t asn_MBR_PlmnID_List_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PlmnID_List, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_POINTER, 2, offsetof(struct PlmnID_List, cu_UP_PM_5GC), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_FGC_CUUP_PM_Format, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cu-UP-PM-5GC" + }, + { ATF_POINTER, 1, offsetof(struct PlmnID_List, cu_UP_PM_EPC), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_EPC_CUUP_PM_Format, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cu-UP-PM-EPC" + }, +}; +static const int asn_MAP_PlmnID_List_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_PlmnID_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PlmnID_List_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cu-UP-PM-5GC */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* cu-UP-PM-EPC */ +}; +asn_SEQUENCE_specifics_t asn_SPC_PlmnID_List_specs_1 = { + sizeof(struct PlmnID_List), + offsetof(struct PlmnID_List, _asn_ctx), + asn_MAP_PlmnID_List_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_PlmnID_List_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_PlmnID_List = { + "PlmnID-List", + "PlmnID-List", + &asn_OP_SEQUENCE, + asn_DEF_PlmnID_List_tags_1, + sizeof(asn_DEF_PlmnID_List_tags_1) + /sizeof(asn_DEF_PlmnID_List_tags_1[0]), /* 1 */ + asn_DEF_PlmnID_List_tags_1, /* Same as above */ + sizeof(asn_DEF_PlmnID_List_tags_1) + /sizeof(asn_DEF_PlmnID_List_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_PlmnID_List_1, + 3, /* Elements count */ + &asn_SPC_PlmnID_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/PlmnID-List.h b/src/codec_utils/E2SMKPM/PlmnID-List.h new file mode 100644 index 000000000..b6faa7298 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PlmnID-List.h @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PlmnID_List_H_ +#define _PlmnID_List_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct FGC_CUUP_PM_Format; +struct EPC_CUUP_PM_Format; + +/* PlmnID-List */ +typedef struct PlmnID_List { + PLMN_Identity_t pLMN_Identity; + struct FGC_CUUP_PM_Format *cu_UP_PM_5GC; /* OPTIONAL */ + struct EPC_CUUP_PM_Format *cu_UP_PM_EPC; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PlmnID_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PlmnID_List; +extern asn_SEQUENCE_specifics_t asn_SPC_PlmnID_List_specs_1; +extern asn_TYPE_member_t asn_MBR_PlmnID_List_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _PlmnID_List_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/PrintableString.c b/src/codec_utils/E2SMKPM/PrintableString.c new file mode 100644 index 000000000..8fc39399e --- /dev/null +++ b/src/codec_utils/E2SMKPM/PrintableString.c @@ -0,0 +1,130 @@ +/*- + * Copyright (c) 2003, 2004, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * ASN.1:1984 (X.409) + */ +static const int _PrintableString_alphabet[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int _PrintableString_code2value[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122}; + +/* + * PrintableString basic type description. + */ +static const ber_tlv_tag_t asn_DEF_PrintableString_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)), /* [UNIVERSAL 19] IMPLICIT ...*/ + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ +}; +static int asn_DEF_PrintableString_v2c(unsigned int value) { + return _PrintableString_alphabet[value > 255 ? 0 : value] - 1; +} +static int asn_DEF_PrintableString_c2v(unsigned int code) { + if(code < 74) + return _PrintableString_code2value[code]; + return -1; +} +static asn_per_constraints_t asn_DEF_PrintableString_per_constraints = { + { APC_CONSTRAINED, 4, 4, 0x20, 0x39 }, /* Value */ + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, /* Size */ + asn_DEF_PrintableString_v2c, + asn_DEF_PrintableString_c2v +}; +asn_TYPE_operation_t asn_OP_PrintableString = { + OCTET_STRING_free, + OCTET_STRING_print_utf8, /* ASCII subset */ + OCTET_STRING_compare, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_utf8, + OCTET_STRING_encode_xer_utf8, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + OCTET_STRING_decode_oer, + OCTET_STRING_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + OCTET_STRING_decode_uper, + OCTET_STRING_encode_uper, + OCTET_STRING_decode_aper, + OCTET_STRING_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + OCTET_STRING_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_PrintableString = { + "PrintableString", + "PrintableString", + &asn_OP_PrintableString, + asn_DEF_PrintableString_tags, + sizeof(asn_DEF_PrintableString_tags) + / sizeof(asn_DEF_PrintableString_tags[0]) - 1, + asn_DEF_PrintableString_tags, + sizeof(asn_DEF_PrintableString_tags) + / sizeof(asn_DEF_PrintableString_tags[0]), + { 0, &asn_DEF_PrintableString_per_constraints, PrintableString_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + + +int +PrintableString_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, + void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + + if(st && st->buf) { + uint8_t *buf = st->buf; + uint8_t *end = buf + st->size; + + /* + * Check the alphabet of the PrintableString. + * ASN.1:1984 (X.409) + */ + for(; buf < end; buf++) { + if(!_PrintableString_alphabet[*buf]) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value byte %ld (%d) " + "not in PrintableString alphabet " + "(%s:%d)", + td->name, + (long)((buf - st->buf) + 1), + *buf, + __FILE__, __LINE__); + return -1; + } + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + return 0; +} diff --git a/src/codec_utils/E2SMKPM/PrintableString.h b/src/codec_utils/E2SMKPM/PrintableString.h new file mode 100644 index 000000000..8c2b61ab2 --- /dev/null +++ b/src/codec_utils/E2SMKPM/PrintableString.h @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PrintableString_H_ +#define _PrintableString_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef OCTET_STRING_t PrintableString_t; /* Implemented via OCTET STRING */ + +extern asn_TYPE_descriptor_t asn_DEF_PrintableString; +extern asn_TYPE_operation_t asn_OP_PrintableString; + +asn_constr_check_f PrintableString_constraint; + +#define PrintableString_free OCTET_STRING_free +#define PrintableString_print OCTET_STRING_print_utf8 +#define PrintableString_compare OCTET_STRING_compare +#define PrintableString_decode_ber OCTET_STRING_decode_ber +#define PrintableString_encode_der OCTET_STRING_encode_der +#define PrintableString_decode_xer OCTET_STRING_decode_xer_utf8 +#define PrintableString_encode_xer OCTET_STRING_encode_xer_utf8 +#define PrintableString_decode_uper OCTET_STRING_decode_uper +#define PrintableString_encode_uper OCTET_STRING_encode_uper +#define PrintableString_decode_aper OCTET_STRING_decode_aper +#define PrintableString_encode_aper OCTET_STRING_encode_aper + +#ifdef __cplusplus +} +#endif + +#endif /* _PrintableString_H_ */ diff --git a/src/codec_utils/E2SMKPM/RAN-Container.c b/src/codec_utils/E2SMKPM/RAN-Container.c new file mode 100644 index 000000000..87a9368a0 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RAN-Container.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RAN-Container.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RAN_Container_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RAN_Container = { + "RAN-Container", + "RAN-Container", + &asn_OP_OCTET_STRING, + asn_DEF_RAN_Container_tags_1, + sizeof(asn_DEF_RAN_Container_tags_1) + /sizeof(asn_DEF_RAN_Container_tags_1[0]), /* 1 */ + asn_DEF_RAN_Container_tags_1, /* Same as above */ + sizeof(asn_DEF_RAN_Container_tags_1) + /sizeof(asn_DEF_RAN_Container_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/RAN-Container.h b/src/codec_utils/E2SMKPM/RAN-Container.h new file mode 100644 index 000000000..52505a316 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RAN-Container.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RAN_Container_H_ +#define _RAN_Container_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RAN-Container */ +typedef OCTET_STRING_t RAN_Container_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RAN_Container; +asn_struct_free_f RAN_Container_free; +asn_struct_print_f RAN_Container_print; +asn_constr_check_f RAN_Container_constraint; +ber_type_decoder_f RAN_Container_decode_ber; +der_type_encoder_f RAN_Container_encode_der; +xer_type_decoder_f RAN_Container_decode_xer; +xer_type_encoder_f RAN_Container_encode_xer; +oer_type_decoder_f RAN_Container_decode_oer; +oer_type_encoder_f RAN_Container_encode_oer; +per_type_decoder_f RAN_Container_decode_uper; +per_type_encoder_f RAN_Container_encode_uper; +per_type_decoder_f RAN_Container_decode_aper; +per_type_encoder_f RAN_Container_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RAN_Container_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.c b/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.c new file mode 100644 index 000000000..e516ed598 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.c @@ -0,0 +1,109 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANcallProcess-ID-string.h" + +static const int permitted_alphabet_table_1[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_1[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_1(const void *sptr) { + const int *table = permitted_alphabet_table_1; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +int +RANcallProcess_ID_string_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_RANcallProcess_ID_string_1_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) + return -1; + return permitted_alphabet_table_1[value] - 1; +} +static int asn_PER_MAP_RANcallProcess_ID_string_1_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) + return -1; + return permitted_alphabet_code2value_1[code]; +} +/* + * This type is implemented using PrintableString, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RANcallProcess_ID_string_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +static asn_per_constraints_t asn_PER_type_RANcallProcess_ID_string_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_RANcallProcess_ID_string_1_v2c, /* Value to PER code map */ + asn_PER_MAP_RANcallProcess_ID_string_1_c2v /* PER code to value map */ +}; +static const ber_tlv_tag_t asn_DEF_RANcallProcess_ID_string_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANcallProcess_ID_string = { + "RANcallProcess-ID-string", + "RANcallProcess-ID-string", + &asn_OP_PrintableString, + asn_DEF_RANcallProcess_ID_string_tags_1, + sizeof(asn_DEF_RANcallProcess_ID_string_tags_1) + /sizeof(asn_DEF_RANcallProcess_ID_string_tags_1[0]), /* 1 */ + asn_DEF_RANcallProcess_ID_string_tags_1, /* Same as above */ + sizeof(asn_DEF_RANcallProcess_ID_string_tags_1) + /sizeof(asn_DEF_RANcallProcess_ID_string_tags_1[0]), /* 1 */ + { &asn_OER_type_RANcallProcess_ID_string_constr_1, &asn_PER_type_RANcallProcess_ID_string_constr_1, RANcallProcess_ID_string_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.h b/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.h new file mode 100644 index 000000000..53c53df22 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RANcallProcess-ID-string.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANcallProcess_ID_string_H_ +#define _RANcallProcess_ID_string_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANcallProcess-ID-string */ +typedef PrintableString_t RANcallProcess_ID_string_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANcallProcess_ID_string; +asn_struct_free_f RANcallProcess_ID_string_free; +asn_struct_print_f RANcallProcess_ID_string_print; +asn_constr_check_f RANcallProcess_ID_string_constraint; +ber_type_decoder_f RANcallProcess_ID_string_decode_ber; +der_type_encoder_f RANcallProcess_ID_string_encode_der; +xer_type_decoder_f RANcallProcess_ID_string_decode_xer; +xer_type_encoder_f RANcallProcess_ID_string_encode_xer; +oer_type_decoder_f RANcallProcess_ID_string_decode_oer; +oer_type_encoder_f RANcallProcess_ID_string_encode_oer; +per_type_decoder_f RANcallProcess_ID_string_decode_uper; +per_type_encoder_f RANcallProcess_ID_string_encode_uper; +per_type_decoder_f RANcallProcess_ID_string_decode_aper; +per_type_encoder_f RANcallProcess_ID_string_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANcallProcess_ID_string_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RANfunction-Name.c b/src/codec_utils/E2SMKPM/RANfunction-Name.c new file mode 100644 index 000000000..6275b91d6 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RANfunction-Name.c @@ -0,0 +1,316 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunction-Name.h" + +static const int permitted_alphabet_table_2[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_2[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_2(const void *sptr) { + const int *table = permitted_alphabet_table_2; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +static const int permitted_alphabet_table_3[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_3[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_3(const void *sptr) { + const int *table = permitted_alphabet_table_3; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +static const int permitted_alphabet_table_4[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_4[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_4(const void *sptr) { + const int *table = permitted_alphabet_table_4; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +static int +memb_ranFunction_ShortName_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_2(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_ranFunction_ShortName_2_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_2)/sizeof(permitted_alphabet_table_2[0])) + return -1; + return permitted_alphabet_table_2[value] - 1; +} +static int asn_PER_MAP_ranFunction_ShortName_2_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_2)/sizeof(permitted_alphabet_code2value_2[0])) + return -1; + return permitted_alphabet_code2value_2[code]; +} +static int +memb_ranFunction_E2SM_OID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 1000) + && !check_permitted_alphabet_3(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_ranFunction_E2SM_OID_3_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_3)/sizeof(permitted_alphabet_table_3[0])) + return -1; + return permitted_alphabet_table_3[value] - 1; +} +static int asn_PER_MAP_ranFunction_E2SM_OID_3_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_3)/sizeof(permitted_alphabet_code2value_3[0])) + return -1; + return permitted_alphabet_code2value_3[code]; +} +static int +memb_ranFunction_Description_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_4(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_ranFunction_Description_4_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_4)/sizeof(permitted_alphabet_table_4[0])) + return -1; + return permitted_alphabet_table_4[value] - 1; +} +static int asn_PER_MAP_ranFunction_Description_4_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_4)/sizeof(permitted_alphabet_code2value_4[0])) + return -1; + return permitted_alphabet_code2value_4[code]; +} +static asn_oer_constraints_t asn_OER_memb_ranFunction_ShortName_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +static asn_per_constraints_t asn_PER_memb_ranFunction_ShortName_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_ranFunction_ShortName_2_v2c, /* Value to PER code map */ + asn_PER_MAP_ranFunction_ShortName_2_c2v /* PER code to value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ranFunction_E2SM_OID_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +static asn_per_constraints_t asn_PER_memb_ranFunction_E2SM_OID_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 10, 10, 1, 1000 } /* (SIZE(1..1000,...)) */, + asn_PER_MAP_ranFunction_E2SM_OID_3_v2c, /* Value to PER code map */ + asn_PER_MAP_ranFunction_E2SM_OID_3_c2v /* PER code to value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ranFunction_Description_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +static asn_per_constraints_t asn_PER_memb_ranFunction_Description_constr_4 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_ranFunction_Description_4_v2c, /* Value to PER code map */ + asn_PER_MAP_ranFunction_Description_4_c2v /* PER code to value map */ +}; +asn_TYPE_member_t asn_MBR_RANfunction_Name_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Name, ranFunction_ShortName), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PrintableString, + 0, + { &asn_OER_memb_ranFunction_ShortName_constr_2, &asn_PER_memb_ranFunction_ShortName_constr_2, memb_ranFunction_ShortName_constraint_1 }, + 0, 0, /* No default value */ + "ranFunction-ShortName" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Name, ranFunction_E2SM_OID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PrintableString, + 0, + { &asn_OER_memb_ranFunction_E2SM_OID_constr_3, &asn_PER_memb_ranFunction_E2SM_OID_constr_3, memb_ranFunction_E2SM_OID_constraint_1 }, + 0, 0, /* No default value */ + "ranFunction-E2SM-OID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Name, ranFunction_Description), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PrintableString, + 0, + { &asn_OER_memb_ranFunction_Description_constr_4, &asn_PER_memb_ranFunction_Description_constr_4, memb_ranFunction_Description_constraint_1 }, + 0, 0, /* No default value */ + "ranFunction-Description" + }, + { ATF_POINTER, 1, offsetof(struct RANfunction_Name, ranFunction_Instance), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunction-Instance" + }, +}; +static const int asn_MAP_RANfunction_Name_oms_1[] = { 3 }; +static const ber_tlv_tag_t asn_DEF_RANfunction_Name_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunction_Name_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunction-ShortName */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranFunction-E2SM-OID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ranFunction-Description */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ranFunction-Instance */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Name_specs_1 = { + sizeof(struct RANfunction_Name), + offsetof(struct RANfunction_Name, _asn_ctx), + asn_MAP_RANfunction_Name_tag2el_1, + 4, /* Count of tags in the map */ + asn_MAP_RANfunction_Name_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + 4, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunction_Name = { + "RANfunction-Name", + "RANfunction-Name", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_Name_tags_1, + sizeof(asn_DEF_RANfunction_Name_tags_1) + /sizeof(asn_DEF_RANfunction_Name_tags_1[0]), /* 1 */ + asn_DEF_RANfunction_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunction_Name_tags_1) + /sizeof(asn_DEF_RANfunction_Name_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_Name_1, + 4, /* Elements count */ + &asn_SPC_RANfunction_Name_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/RANfunction-Name.h b/src/codec_utils/E2SMKPM/RANfunction-Name.h new file mode 100644 index 000000000..fac1e4123 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RANfunction-Name.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunction_Name_H_ +#define _RANfunction_Name_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunction-Name */ +typedef struct RANfunction_Name { + PrintableString_t ranFunction_ShortName; + PrintableString_t ranFunction_E2SM_OID; + PrintableString_t ranFunction_Description; + long *ranFunction_Instance; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunction_Name_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Name; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Name_specs_1; +extern asn_TYPE_member_t asn_MBR_RANfunction_Name_1[4]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunction_Name_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.c b/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.c new file mode 100644 index 000000000..1b5cc631b --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RIC-EventTriggerStyle-List.h" + +asn_TYPE_member_t asn_MBR_RIC_EventTriggerStyle_List_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RIC_EventTriggerStyle_List, ric_EventTriggerStyle_Type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-EventTriggerStyle-Type" + }, + { ATF_NOFLAGS, 0, offsetof(struct RIC_EventTriggerStyle_List, ric_EventTriggerStyle_Name), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Name, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-EventTriggerStyle-Name" + }, + { ATF_NOFLAGS, 0, offsetof(struct RIC_EventTriggerStyle_List, ric_EventTriggerFormat_Type), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Format_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-EventTriggerFormat-Type" + }, +}; +static const ber_tlv_tag_t asn_DEF_RIC_EventTriggerStyle_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RIC_EventTriggerStyle_List_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ric-EventTriggerStyle-Type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ric-EventTriggerStyle-Name */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ric-EventTriggerFormat-Type */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RIC_EventTriggerStyle_List_specs_1 = { + sizeof(struct RIC_EventTriggerStyle_List), + offsetof(struct RIC_EventTriggerStyle_List, _asn_ctx), + asn_MAP_RIC_EventTriggerStyle_List_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RIC_EventTriggerStyle_List = { + "RIC-EventTriggerStyle-List", + "RIC-EventTriggerStyle-List", + &asn_OP_SEQUENCE, + asn_DEF_RIC_EventTriggerStyle_List_tags_1, + sizeof(asn_DEF_RIC_EventTriggerStyle_List_tags_1) + /sizeof(asn_DEF_RIC_EventTriggerStyle_List_tags_1[0]), /* 1 */ + asn_DEF_RIC_EventTriggerStyle_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RIC_EventTriggerStyle_List_tags_1) + /sizeof(asn_DEF_RIC_EventTriggerStyle_List_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RIC_EventTriggerStyle_List_1, + 3, /* Elements count */ + &asn_SPC_RIC_EventTriggerStyle_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.h b/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.h new file mode 100644 index 000000000..ca1d0a6ef --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-EventTriggerStyle-List.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RIC_EventTriggerStyle_List_H_ +#define _RIC_EventTriggerStyle_List_H_ + + +#include + +/* Including external dependencies */ +#include "RIC-Style-Type.h" +#include "RIC-Style-Name.h" +#include "RIC-Format-Type.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RIC-EventTriggerStyle-List */ +typedef struct RIC_EventTriggerStyle_List { + RIC_Style_Type_t ric_EventTriggerStyle_Type; + RIC_Style_Name_t ric_EventTriggerStyle_Name; + RIC_Format_Type_t ric_EventTriggerFormat_Type; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RIC_EventTriggerStyle_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RIC_EventTriggerStyle_List; +extern asn_SEQUENCE_specifics_t asn_SPC_RIC_EventTriggerStyle_List_specs_1; +extern asn_TYPE_member_t asn_MBR_RIC_EventTriggerStyle_List_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RIC_EventTriggerStyle_List_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RIC-Format-Type.c b/src/codec_utils/E2SMKPM/RIC-Format-Type.c new file mode 100644 index 000000000..d3f18ff54 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Format-Type.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RIC-Format-Type.h" + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RIC_Format_Type_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RIC_Format_Type = { + "RIC-Format-Type", + "RIC-Format-Type", + &asn_OP_NativeInteger, + asn_DEF_RIC_Format_Type_tags_1, + sizeof(asn_DEF_RIC_Format_Type_tags_1) + /sizeof(asn_DEF_RIC_Format_Type_tags_1[0]), /* 1 */ + asn_DEF_RIC_Format_Type_tags_1, /* Same as above */ + sizeof(asn_DEF_RIC_Format_Type_tags_1) + /sizeof(asn_DEF_RIC_Format_Type_tags_1[0]), /* 1 */ + { 0, 0, NativeInteger_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/RIC-Format-Type.h b/src/codec_utils/E2SMKPM/RIC-Format-Type.h new file mode 100644 index 000000000..e2f749c81 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Format-Type.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RIC_Format_Type_H_ +#define _RIC_Format_Type_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RIC-Format-Type */ +typedef long RIC_Format_Type_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RIC_Format_Type; +asn_struct_free_f RIC_Format_Type_free; +asn_struct_print_f RIC_Format_Type_print; +asn_constr_check_f RIC_Format_Type_constraint; +ber_type_decoder_f RIC_Format_Type_decode_ber; +der_type_encoder_f RIC_Format_Type_encode_der; +xer_type_decoder_f RIC_Format_Type_decode_xer; +xer_type_encoder_f RIC_Format_Type_encode_xer; +oer_type_decoder_f RIC_Format_Type_decode_oer; +oer_type_encoder_f RIC_Format_Type_encode_oer; +per_type_decoder_f RIC_Format_Type_decode_uper; +per_type_encoder_f RIC_Format_Type_encode_uper; +per_type_decoder_f RIC_Format_Type_decode_aper; +per_type_encoder_f RIC_Format_Type_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RIC_Format_Type_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.c b/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.c new file mode 100644 index 000000000..c00894cd0 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.c @@ -0,0 +1,80 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RIC-ReportStyle-List.h" + +asn_TYPE_member_t asn_MBR_RIC_ReportStyle_List_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RIC_ReportStyle_List, ric_ReportStyle_Type), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-ReportStyle-Type" + }, + { ATF_NOFLAGS, 0, offsetof(struct RIC_ReportStyle_List, ric_ReportStyle_Name), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Style_Name, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-ReportStyle-Name" + }, + { ATF_NOFLAGS, 0, offsetof(struct RIC_ReportStyle_List, ric_IndicationHeaderFormat_Type), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Format_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-IndicationHeaderFormat-Type" + }, + { ATF_NOFLAGS, 0, offsetof(struct RIC_ReportStyle_List, ric_IndicationMessageFormat_Type), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RIC_Format_Type, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ric-IndicationMessageFormat-Type" + }, +}; +static const ber_tlv_tag_t asn_DEF_RIC_ReportStyle_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RIC_ReportStyle_List_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ric-ReportStyle-Type */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ric-ReportStyle-Name */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ric-IndicationHeaderFormat-Type */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ric-IndicationMessageFormat-Type */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RIC_ReportStyle_List_specs_1 = { + sizeof(struct RIC_ReportStyle_List), + offsetof(struct RIC_ReportStyle_List, _asn_ctx), + asn_MAP_RIC_ReportStyle_List_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 4, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RIC_ReportStyle_List = { + "RIC-ReportStyle-List", + "RIC-ReportStyle-List", + &asn_OP_SEQUENCE, + asn_DEF_RIC_ReportStyle_List_tags_1, + sizeof(asn_DEF_RIC_ReportStyle_List_tags_1) + /sizeof(asn_DEF_RIC_ReportStyle_List_tags_1[0]), /* 1 */ + asn_DEF_RIC_ReportStyle_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RIC_ReportStyle_List_tags_1) + /sizeof(asn_DEF_RIC_ReportStyle_List_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RIC_ReportStyle_List_1, + 4, /* Elements count */ + &asn_SPC_RIC_ReportStyle_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.h b/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.h new file mode 100644 index 000000000..b63e458cf --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-ReportStyle-List.h @@ -0,0 +1,49 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RIC_ReportStyle_List_H_ +#define _RIC_ReportStyle_List_H_ + + +#include + +/* Including external dependencies */ +#include "RIC-Style-Type.h" +#include "RIC-Style-Name.h" +#include "RIC-Format-Type.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RIC-ReportStyle-List */ +typedef struct RIC_ReportStyle_List { + RIC_Style_Type_t ric_ReportStyle_Type; + RIC_Style_Name_t ric_ReportStyle_Name; + RIC_Format_Type_t ric_IndicationHeaderFormat_Type; + RIC_Format_Type_t ric_IndicationMessageFormat_Type; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RIC_ReportStyle_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RIC_ReportStyle_List; +extern asn_SEQUENCE_specifics_t asn_SPC_RIC_ReportStyle_List_specs_1; +extern asn_TYPE_member_t asn_MBR_RIC_ReportStyle_List_1[4]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RIC_ReportStyle_List_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RIC-Style-Name.c b/src/codec_utils/E2SMKPM/RIC-Style-Name.c new file mode 100644 index 000000000..d9261c473 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Style-Name.c @@ -0,0 +1,109 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RIC-Style-Name.h" + +static const int permitted_alphabet_table_1[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */ + 1, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 5, 6, 7, 8, 9, /* . '() +,-./ */ +10,11,12,13,14,15,16,17,18,19,20, 0, 0,21, 0,22, /* 0123456789: = ? */ + 0,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37, /* ABCDEFGHIJKLMNO */ +38,39,40,41,42,43,44,45,46,47,48, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ */ + 0,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63, /* abcdefghijklmno */ +64,65,66,67,68,69,70,71,72,73,74, 0, 0, 0, 0, 0, /* pqrstuvwxyz */ +}; +static const int permitted_alphabet_code2value_1[74] = { +32,39,40,41,43,44,45,46,47,48,49,50,51,52,53,54, +55,56,57,58,61,63,65,66,67,68,69,70,71,72,73,74, +75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90, +97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, +113,114,115,116,117,118,119,120,121,122,}; + + +static int check_permitted_alphabet_1(const void *sptr) { + const int *table = permitted_alphabet_table_1; + /* The underlying type is PrintableString */ + const PrintableString_t *st = (const PrintableString_t *)sptr; + const uint8_t *ch = st->buf; + const uint8_t *end = ch + st->size; + + for(; ch < end; ch++) { + uint8_t cv = *ch; + if(!table[cv]) return -1; + } + return 0; +} + +int +RIC_Style_Name_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const PrintableString_t *st = (const PrintableString_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size >= 1 && size <= 150) + && !check_permitted_alphabet_1(st)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int asn_PER_MAP_RIC_Style_Name_1_v2c(unsigned int value) { + if(value >= sizeof(permitted_alphabet_table_1)/sizeof(permitted_alphabet_table_1[0])) + return -1; + return permitted_alphabet_table_1[value] - 1; +} +static int asn_PER_MAP_RIC_Style_Name_1_c2v(unsigned int code) { + if(code >= sizeof(permitted_alphabet_code2value_1)/sizeof(permitted_alphabet_code2value_1[0])) + return -1; + return permitted_alphabet_code2value_1[code]; +} +/* + * This type is implemented using PrintableString, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RIC_Style_Name_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..MAX)) */}; +asn_per_constraints_t asn_PER_type_RIC_Style_Name_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 7, 7, 32, 122 } /* (32..122) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 8, 8, 1, 150 } /* (SIZE(1..150,...)) */, + asn_PER_MAP_RIC_Style_Name_1_v2c, /* Value to PER code map */ + asn_PER_MAP_RIC_Style_Name_1_c2v /* PER code to value map */ +}; +static const ber_tlv_tag_t asn_DEF_RIC_Style_Name_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (19 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RIC_Style_Name = { + "RIC-Style-Name", + "RIC-Style-Name", + &asn_OP_PrintableString, + asn_DEF_RIC_Style_Name_tags_1, + sizeof(asn_DEF_RIC_Style_Name_tags_1) + /sizeof(asn_DEF_RIC_Style_Name_tags_1[0]), /* 1 */ + asn_DEF_RIC_Style_Name_tags_1, /* Same as above */ + sizeof(asn_DEF_RIC_Style_Name_tags_1) + /sizeof(asn_DEF_RIC_Style_Name_tags_1[0]), /* 1 */ + { &asn_OER_type_RIC_Style_Name_constr_1, &asn_PER_type_RIC_Style_Name_constr_1, RIC_Style_Name_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/RIC-Style-Name.h b/src/codec_utils/E2SMKPM/RIC-Style-Name.h new file mode 100644 index 000000000..f46e5f590 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Style-Name.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RIC_Style_Name_H_ +#define _RIC_Style_Name_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RIC-Style-Name */ +typedef PrintableString_t RIC_Style_Name_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RIC_Style_Name_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RIC_Style_Name; +asn_struct_free_f RIC_Style_Name_free; +asn_struct_print_f RIC_Style_Name_print; +asn_constr_check_f RIC_Style_Name_constraint; +ber_type_decoder_f RIC_Style_Name_decode_ber; +der_type_encoder_f RIC_Style_Name_encode_der; +xer_type_decoder_f RIC_Style_Name_decode_xer; +xer_type_encoder_f RIC_Style_Name_encode_xer; +oer_type_decoder_f RIC_Style_Name_decode_oer; +oer_type_encoder_f RIC_Style_Name_encode_oer; +per_type_decoder_f RIC_Style_Name_decode_uper; +per_type_encoder_f RIC_Style_Name_encode_uper; +per_type_decoder_f RIC_Style_Name_decode_aper; +per_type_encoder_f RIC_Style_Name_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RIC_Style_Name_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RIC-Style-Type.c b/src/codec_utils/E2SMKPM/RIC-Style-Type.c new file mode 100644 index 000000000..bd59b4dbf --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Style-Type.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RIC-Style-Type.h" + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RIC_Style_Type_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RIC_Style_Type = { + "RIC-Style-Type", + "RIC-Style-Type", + &asn_OP_NativeInteger, + asn_DEF_RIC_Style_Type_tags_1, + sizeof(asn_DEF_RIC_Style_Type_tags_1) + /sizeof(asn_DEF_RIC_Style_Type_tags_1[0]), /* 1 */ + asn_DEF_RIC_Style_Type_tags_1, /* Same as above */ + sizeof(asn_DEF_RIC_Style_Type_tags_1) + /sizeof(asn_DEF_RIC_Style_Type_tags_1[0]), /* 1 */ + { 0, 0, NativeInteger_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2SMKPM/RIC-Style-Type.h b/src/codec_utils/E2SMKPM/RIC-Style-Type.h new file mode 100644 index 000000000..ab80524c2 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RIC-Style-Type.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RIC_Style_Type_H_ +#define _RIC_Style_Type_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RIC-Style-Type */ +typedef long RIC_Style_Type_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RIC_Style_Type; +asn_struct_free_f RIC_Style_Type_free; +asn_struct_print_f RIC_Style_Type_print; +asn_constr_check_f RIC_Style_Type_constraint; +ber_type_decoder_f RIC_Style_Type_decode_ber; +der_type_encoder_f RIC_Style_Type_encode_der; +xer_type_decoder_f RIC_Style_Type_decode_xer; +xer_type_encoder_f RIC_Style_Type_encode_xer; +oer_type_decoder_f RIC_Style_Type_decode_oer; +oer_type_encoder_f RIC_Style_Type_encode_oer; +per_type_decoder_f RIC_Style_Type_decode_uper; +per_type_encoder_f RIC_Style_Type_encode_uper; +per_type_decoder_f RIC_Style_Type_decode_aper; +per_type_encoder_f RIC_Style_Type_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RIC_Style_Type_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/RT-Period-IE.c b/src/codec_utils/E2SMKPM/RT-Period-IE.c new file mode 100644 index 000000000..2962a22e9 --- /dev/null +++ b/src/codec_utils/E2SMKPM/RT-Period-IE.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RT-Period-IE.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RT_Period_IE_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RT_Period_IE_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 19 } /* (0..19,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RT_Period_IE_value2enum_1[] = { + { 0, 4, "ms10" }, + { 1, 4, "ms20" }, + { 2, 4, "ms32" }, + { 3, 4, "ms40" }, + { 4, 4, "ms60" }, + { 5, 4, "ms64" }, + { 6, 4, "ms70" }, + { 7, 4, "ms80" }, + { 8, 5, "ms128" }, + { 9, 5, "ms160" }, + { 10, 5, "ms256" }, + { 11, 5, "ms320" }, + { 12, 5, "ms512" }, + { 13, 5, "ms640" }, + { 14, 6, "ms1024" }, + { 15, 6, "ms1280" }, + { 16, 6, "ms2048" }, + { 17, 6, "ms2560" }, + { 18, 6, "ms5120" }, + { 19, 7, "ms10240" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RT_Period_IE_enum2value_1[] = { + 0, /* ms10(0) */ + 14, /* ms1024(14) */ + 19, /* ms10240(19) */ + 8, /* ms128(8) */ + 15, /* ms1280(15) */ + 9, /* ms160(9) */ + 1, /* ms20(1) */ + 16, /* ms2048(16) */ + 10, /* ms256(10) */ + 17, /* ms2560(17) */ + 2, /* ms32(2) */ + 11, /* ms320(11) */ + 3, /* ms40(3) */ + 12, /* ms512(12) */ + 18, /* ms5120(18) */ + 4, /* ms60(4) */ + 5, /* ms64(5) */ + 13, /* ms640(13) */ + 6, /* ms70(6) */ + 7 /* ms80(7) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RT_Period_IE_specs_1 = { + asn_MAP_RT_Period_IE_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RT_Period_IE_enum2value_1, /* N => "tag"; sorted by N */ + 20, /* Number of elements in the maps */ + 21, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RT_Period_IE_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RT_Period_IE = { + "RT-Period-IE", + "RT-Period-IE", + &asn_OP_NativeEnumerated, + asn_DEF_RT_Period_IE_tags_1, + sizeof(asn_DEF_RT_Period_IE_tags_1) + /sizeof(asn_DEF_RT_Period_IE_tags_1[0]), /* 1 */ + asn_DEF_RT_Period_IE_tags_1, /* Same as above */ + sizeof(asn_DEF_RT_Period_IE_tags_1) + /sizeof(asn_DEF_RT_Period_IE_tags_1[0]), /* 1 */ + { &asn_OER_type_RT_Period_IE_constr_1, &asn_PER_type_RT_Period_IE_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RT_Period_IE_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/RT-Period-IE.h b/src/codec_utils/E2SMKPM/RT-Period-IE.h new file mode 100644 index 000000000..a18ae4e8a --- /dev/null +++ b/src/codec_utils/E2SMKPM/RT-Period-IE.h @@ -0,0 +1,74 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RT_Period_IE_H_ +#define _RT_Period_IE_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RT_Period_IE { + RT_Period_IE_ms10 = 0, + RT_Period_IE_ms20 = 1, + RT_Period_IE_ms32 = 2, + RT_Period_IE_ms40 = 3, + RT_Period_IE_ms60 = 4, + RT_Period_IE_ms64 = 5, + RT_Period_IE_ms70 = 6, + RT_Period_IE_ms80 = 7, + RT_Period_IE_ms128 = 8, + RT_Period_IE_ms160 = 9, + RT_Period_IE_ms256 = 10, + RT_Period_IE_ms320 = 11, + RT_Period_IE_ms512 = 12, + RT_Period_IE_ms640 = 13, + RT_Period_IE_ms1024 = 14, + RT_Period_IE_ms1280 = 15, + RT_Period_IE_ms2048 = 16, + RT_Period_IE_ms2560 = 17, + RT_Period_IE_ms5120 = 18, + RT_Period_IE_ms10240 = 19 + /* + * Enumeration is extensible + */ +} e_RT_Period_IE; + +/* RT-Period-IE */ +typedef long RT_Period_IE_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RT_Period_IE_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RT_Period_IE; +extern const asn_INTEGER_specifics_t asn_SPC_RT_Period_IE_specs_1; +asn_struct_free_f RT_Period_IE_free; +asn_struct_print_f RT_Period_IE_print; +asn_constr_check_f RT_Period_IE_constraint; +ber_type_decoder_f RT_Period_IE_decode_ber; +der_type_encoder_f RT_Period_IE_encode_der; +xer_type_decoder_f RT_Period_IE_decode_xer; +xer_type_encoder_f RT_Period_IE_encode_xer; +oer_type_decoder_f RT_Period_IE_decode_oer; +oer_type_encoder_f RT_Period_IE_encode_oer; +per_type_decoder_f RT_Period_IE_decode_uper; +per_type_encoder_f RT_Period_IE_encode_uper; +per_type_decoder_f RT_Period_IE_decode_aper; +per_type_encoder_f RT_Period_IE_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RT_Period_IE_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/SNSSAI.c b/src/codec_utils/E2SMKPM/SNSSAI.c new file mode 100644 index 000000000..6dccd81be --- /dev/null +++ b/src/codec_utils/E2SMKPM/SNSSAI.c @@ -0,0 +1,130 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "SNSSAI.h" + +static int +memb_sST_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 1)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_sD_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 3)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_sST_constr_2 CC_NOTUSED = { + { 0, 0 }, + 1 /* (SIZE(1..1)) */}; +static asn_per_constraints_t asn_PER_memb_sST_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 1, 1 } /* (SIZE(1..1)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_sD_constr_3 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +static asn_per_constraints_t asn_PER_memb_sD_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 3, 3 } /* (SIZE(3..3)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_SNSSAI_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SNSSAI, sST), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { &asn_OER_memb_sST_constr_2, &asn_PER_memb_sST_constr_2, memb_sST_constraint_1 }, + 0, 0, /* No default value */ + "sST" + }, + { ATF_POINTER, 1, offsetof(struct SNSSAI, sD), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, + { &asn_OER_memb_sD_constr_3, &asn_PER_memb_sD_constr_3, memb_sD_constraint_1 }, + 0, 0, /* No default value */ + "sD" + }, +}; +static const int asn_MAP_SNSSAI_oms_1[] = { 1 }; +static const ber_tlv_tag_t asn_DEF_SNSSAI_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SNSSAI_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sST */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* sD */ +}; +asn_SEQUENCE_specifics_t asn_SPC_SNSSAI_specs_1 = { + sizeof(struct SNSSAI), + offsetof(struct SNSSAI, _asn_ctx), + asn_MAP_SNSSAI_tag2el_1, + 2, /* Count of tags in the map */ + asn_MAP_SNSSAI_oms_1, /* Optional members */ + 1, 0, /* Root/Additions */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_SNSSAI = { + "SNSSAI", + "SNSSAI", + &asn_OP_SEQUENCE, + asn_DEF_SNSSAI_tags_1, + sizeof(asn_DEF_SNSSAI_tags_1) + /sizeof(asn_DEF_SNSSAI_tags_1[0]), /* 1 */ + asn_DEF_SNSSAI_tags_1, /* Same as above */ + sizeof(asn_DEF_SNSSAI_tags_1) + /sizeof(asn_DEF_SNSSAI_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_SNSSAI_1, + 2, /* Elements count */ + &asn_SPC_SNSSAI_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/SNSSAI.h b/src/codec_utils/E2SMKPM/SNSSAI.h new file mode 100644 index 000000000..6c2aedf76 --- /dev/null +++ b/src/codec_utils/E2SMKPM/SNSSAI.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _SNSSAI_H_ +#define _SNSSAI_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SNSSAI */ +typedef struct SNSSAI { + OCTET_STRING_t sST; + OCTET_STRING_t *sD; /* OPTIONAL */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SNSSAI_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_SNSSAI; +extern asn_SEQUENCE_specifics_t asn_SPC_SNSSAI_specs_1; +extern asn_TYPE_member_t asn_MBR_SNSSAI_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _SNSSAI_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.c b/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.c new file mode 100644 index 000000000..a649c6349 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.c @@ -0,0 +1,74 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ServedPlmnPerCellListItem.h" + +#include "FGC-DU-PM-Container.h" +#include "EPC-DU-PM-Container.h" +asn_TYPE_member_t asn_MBR_ServedPlmnPerCellListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ServedPlmnPerCellListItem, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_Identity, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_POINTER, 2, offsetof(struct ServedPlmnPerCellListItem, du_PM_5GC), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_FGC_DU_PM_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "du-PM-5GC" + }, + { ATF_POINTER, 1, offsetof(struct ServedPlmnPerCellListItem, du_PM_EPC), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_EPC_DU_PM_Container, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "du-PM-EPC" + }, +}; +static const int asn_MAP_ServedPlmnPerCellListItem_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_ServedPlmnPerCellListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ServedPlmnPerCellListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* du-PM-5GC */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* du-PM-EPC */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ServedPlmnPerCellListItem_specs_1 = { + sizeof(struct ServedPlmnPerCellListItem), + offsetof(struct ServedPlmnPerCellListItem, _asn_ctx), + asn_MAP_ServedPlmnPerCellListItem_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_ServedPlmnPerCellListItem_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ServedPlmnPerCellListItem = { + "ServedPlmnPerCellListItem", + "ServedPlmnPerCellListItem", + &asn_OP_SEQUENCE, + asn_DEF_ServedPlmnPerCellListItem_tags_1, + sizeof(asn_DEF_ServedPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_ServedPlmnPerCellListItem_tags_1[0]), /* 1 */ + asn_DEF_ServedPlmnPerCellListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_ServedPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_ServedPlmnPerCellListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ServedPlmnPerCellListItem_1, + 3, /* Elements count */ + &asn_SPC_ServedPlmnPerCellListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.h b/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.h new file mode 100644 index 000000000..3ed335f95 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ServedPlmnPerCellListItem.h @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ServedPlmnPerCellListItem_H_ +#define _ServedPlmnPerCellListItem_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-Identity.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct FGC_DU_PM_Container; +struct EPC_DU_PM_Container; + +/* ServedPlmnPerCellListItem */ +typedef struct ServedPlmnPerCellListItem { + PLMN_Identity_t pLMN_Identity; + struct FGC_DU_PM_Container *du_PM_5GC; /* OPTIONAL */ + struct EPC_DU_PM_Container *du_PM_EPC; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ServedPlmnPerCellListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ServedPlmnPerCellListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_ServedPlmnPerCellListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_ServedPlmnPerCellListItem_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ServedPlmnPerCellListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.c b/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.c new file mode 100644 index 000000000..0477e1627 --- /dev/null +++ b/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.c @@ -0,0 +1,140 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "SlicePerPlmnPerCellListItem.h" + +#include "FQIPERSlicesPerPlmnPerCellListItem.h" +static int +memb_fQIPERSlicesPerPlmnPerCellList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 64)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_fQIPERSlicesPerPlmnPerCellList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..64)) */}; +static asn_per_constraints_t asn_PER_type_fQIPERSlicesPerPlmnPerCellList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 64 } /* (SIZE(1..64)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_fQIPERSlicesPerPlmnPerCellList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..64)) */}; +static asn_per_constraints_t asn_PER_memb_fQIPERSlicesPerPlmnPerCellList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 64 } /* (SIZE(1..64)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_fQIPERSlicesPerPlmnPerCellList_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_FQIPERSlicesPerPlmnPerCellListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_fQIPERSlicesPerPlmnPerCellList_specs_3 = { + sizeof(struct SlicePerPlmnPerCellListItem__fQIPERSlicesPerPlmnPerCellList), + offsetof(struct SlicePerPlmnPerCellListItem__fQIPERSlicesPerPlmnPerCellList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_fQIPERSlicesPerPlmnPerCellList_3 = { + "fQIPERSlicesPerPlmnPerCellList", + "fQIPERSlicesPerPlmnPerCellList", + &asn_OP_SEQUENCE_OF, + asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3, + sizeof(asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3) + /sizeof(asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3[0]) - 1, /* 1 */ + asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3, /* Same as above */ + sizeof(asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3) + /sizeof(asn_DEF_fQIPERSlicesPerPlmnPerCellList_tags_3[0]), /* 2 */ + { &asn_OER_type_fQIPERSlicesPerPlmnPerCellList_constr_3, &asn_PER_type_fQIPERSlicesPerPlmnPerCellList_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_fQIPERSlicesPerPlmnPerCellList_3, + 1, /* Single element */ + &asn_SPC_fQIPERSlicesPerPlmnPerCellList_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_SlicePerPlmnPerCellListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SlicePerPlmnPerCellListItem, sliceID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SNSSAI, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "sliceID" + }, + { ATF_NOFLAGS, 0, offsetof(struct SlicePerPlmnPerCellListItem, fQIPERSlicesPerPlmnPerCellList), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_fQIPERSlicesPerPlmnPerCellList_3, + 0, + { &asn_OER_memb_fQIPERSlicesPerPlmnPerCellList_constr_3, &asn_PER_memb_fQIPERSlicesPerPlmnPerCellList_constr_3, memb_fQIPERSlicesPerPlmnPerCellList_constraint_1 }, + 0, 0, /* No default value */ + "fQIPERSlicesPerPlmnPerCellList" + }, +}; +static const ber_tlv_tag_t asn_DEF_SlicePerPlmnPerCellListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SlicePerPlmnPerCellListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sliceID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* fQIPERSlicesPerPlmnPerCellList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_SlicePerPlmnPerCellListItem_specs_1 = { + sizeof(struct SlicePerPlmnPerCellListItem), + offsetof(struct SlicePerPlmnPerCellListItem, _asn_ctx), + asn_MAP_SlicePerPlmnPerCellListItem_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_SlicePerPlmnPerCellListItem = { + "SlicePerPlmnPerCellListItem", + "SlicePerPlmnPerCellListItem", + &asn_OP_SEQUENCE, + asn_DEF_SlicePerPlmnPerCellListItem_tags_1, + sizeof(asn_DEF_SlicePerPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_SlicePerPlmnPerCellListItem_tags_1[0]), /* 1 */ + asn_DEF_SlicePerPlmnPerCellListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_SlicePerPlmnPerCellListItem_tags_1) + /sizeof(asn_DEF_SlicePerPlmnPerCellListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_SlicePerPlmnPerCellListItem_1, + 2, /* Elements count */ + &asn_SPC_SlicePerPlmnPerCellListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.h b/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.h new file mode 100644 index 000000000..4d3c1967b --- /dev/null +++ b/src/codec_utils/E2SMKPM/SlicePerPlmnPerCellListItem.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _SlicePerPlmnPerCellListItem_H_ +#define _SlicePerPlmnPerCellListItem_H_ + + +#include + +/* Including external dependencies */ +#include "SNSSAI.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct FQIPERSlicesPerPlmnPerCellListItem; + +/* SlicePerPlmnPerCellListItem */ +typedef struct SlicePerPlmnPerCellListItem { + SNSSAI_t sliceID; + struct SlicePerPlmnPerCellListItem__fQIPERSlicesPerPlmnPerCellList { + A_SEQUENCE_OF(struct FQIPERSlicesPerPlmnPerCellListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } fQIPERSlicesPerPlmnPerCellList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SlicePerPlmnPerCellListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_SlicePerPlmnPerCellListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_SlicePerPlmnPerCellListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_SlicePerPlmnPerCellListItem_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _SlicePerPlmnPerCellListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/SliceToReportListItem.c b/src/codec_utils/E2SMKPM/SliceToReportListItem.c new file mode 100644 index 000000000..de09a0d29 --- /dev/null +++ b/src/codec_utils/E2SMKPM/SliceToReportListItem.c @@ -0,0 +1,140 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "SliceToReportListItem.h" + +#include "FQIPERSlicesPerPlmnListItem.h" +static int +memb_fQIPERSlicesPerPlmnList_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* Determine the number of elements */ + size = _A_CSEQUENCE_FROM_VOID(sptr)->count; + + if((size >= 1 && size <= 64)) { + /* Perform validation of the inner elements */ + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_type_fQIPERSlicesPerPlmnList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..64)) */}; +static asn_per_constraints_t asn_PER_type_fQIPERSlicesPerPlmnList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 64 } /* (SIZE(1..64)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_fQIPERSlicesPerPlmnList_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..64)) */}; +static asn_per_constraints_t asn_PER_memb_fQIPERSlicesPerPlmnList_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 6, 6, 1, 64 } /* (SIZE(1..64)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_fQIPERSlicesPerPlmnList_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_FQIPERSlicesPerPlmnListItem, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_fQIPERSlicesPerPlmnList_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_fQIPERSlicesPerPlmnList_specs_3 = { + sizeof(struct SliceToReportListItem__fQIPERSlicesPerPlmnList), + offsetof(struct SliceToReportListItem__fQIPERSlicesPerPlmnList, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_fQIPERSlicesPerPlmnList_3 = { + "fQIPERSlicesPerPlmnList", + "fQIPERSlicesPerPlmnList", + &asn_OP_SEQUENCE_OF, + asn_DEF_fQIPERSlicesPerPlmnList_tags_3, + sizeof(asn_DEF_fQIPERSlicesPerPlmnList_tags_3) + /sizeof(asn_DEF_fQIPERSlicesPerPlmnList_tags_3[0]) - 1, /* 1 */ + asn_DEF_fQIPERSlicesPerPlmnList_tags_3, /* Same as above */ + sizeof(asn_DEF_fQIPERSlicesPerPlmnList_tags_3) + /sizeof(asn_DEF_fQIPERSlicesPerPlmnList_tags_3[0]), /* 2 */ + { &asn_OER_type_fQIPERSlicesPerPlmnList_constr_3, &asn_PER_type_fQIPERSlicesPerPlmnList_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_fQIPERSlicesPerPlmnList_3, + 1, /* Single element */ + &asn_SPC_fQIPERSlicesPerPlmnList_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_SliceToReportListItem_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SliceToReportListItem, sliceID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SNSSAI, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "sliceID" + }, + { ATF_NOFLAGS, 0, offsetof(struct SliceToReportListItem, fQIPERSlicesPerPlmnList), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_fQIPERSlicesPerPlmnList_3, + 0, + { &asn_OER_memb_fQIPERSlicesPerPlmnList_constr_3, &asn_PER_memb_fQIPERSlicesPerPlmnList_constr_3, memb_fQIPERSlicesPerPlmnList_constraint_1 }, + 0, 0, /* No default value */ + "fQIPERSlicesPerPlmnList" + }, +}; +static const ber_tlv_tag_t asn_DEF_SliceToReportListItem_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SliceToReportListItem_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sliceID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* fQIPERSlicesPerPlmnList */ +}; +asn_SEQUENCE_specifics_t asn_SPC_SliceToReportListItem_specs_1 = { + sizeof(struct SliceToReportListItem), + offsetof(struct SliceToReportListItem, _asn_ctx), + asn_MAP_SliceToReportListItem_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_SliceToReportListItem = { + "SliceToReportListItem", + "SliceToReportListItem", + &asn_OP_SEQUENCE, + asn_DEF_SliceToReportListItem_tags_1, + sizeof(asn_DEF_SliceToReportListItem_tags_1) + /sizeof(asn_DEF_SliceToReportListItem_tags_1[0]), /* 1 */ + asn_DEF_SliceToReportListItem_tags_1, /* Same as above */ + sizeof(asn_DEF_SliceToReportListItem_tags_1) + /sizeof(asn_DEF_SliceToReportListItem_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_SliceToReportListItem_1, + 2, /* Elements count */ + &asn_SPC_SliceToReportListItem_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/SliceToReportListItem.h b/src/codec_utils/E2SMKPM/SliceToReportListItem.h new file mode 100644 index 000000000..59e98ff84 --- /dev/null +++ b/src/codec_utils/E2SMKPM/SliceToReportListItem.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _SliceToReportListItem_H_ +#define _SliceToReportListItem_H_ + + +#include + +/* Including external dependencies */ +#include "SNSSAI.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct FQIPERSlicesPerPlmnListItem; + +/* SliceToReportListItem */ +typedef struct SliceToReportListItem { + SNSSAI_t sliceID; + struct SliceToReportListItem__fQIPERSlicesPerPlmnList { + A_SEQUENCE_OF(struct FQIPERSlicesPerPlmnListItem) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } fQIPERSlicesPerPlmnList; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SliceToReportListItem_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_SliceToReportListItem; +extern asn_SEQUENCE_specifics_t asn_SPC_SliceToReportListItem_specs_1; +extern asn_TYPE_member_t asn_MBR_SliceToReportListItem_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _SliceToReportListItem_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.c b/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.c new file mode 100644 index 000000000..7049f61be --- /dev/null +++ b/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "Trigger-ConditionIE-Item.h" + +asn_TYPE_member_t asn_MBR_Trigger_ConditionIE_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Trigger_ConditionIE_Item, report_Period_IE), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RT_Period_IE, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "report-Period-IE" + }, +}; +static const ber_tlv_tag_t asn_DEF_Trigger_ConditionIE_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_Trigger_ConditionIE_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* report-Period-IE */ +}; +asn_SEQUENCE_specifics_t asn_SPC_Trigger_ConditionIE_Item_specs_1 = { + sizeof(struct Trigger_ConditionIE_Item), + offsetof(struct Trigger_ConditionIE_Item, _asn_ctx), + asn_MAP_Trigger_ConditionIE_Item_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_Trigger_ConditionIE_Item = { + "Trigger-ConditionIE-Item", + "Trigger-ConditionIE-Item", + &asn_OP_SEQUENCE, + asn_DEF_Trigger_ConditionIE_Item_tags_1, + sizeof(asn_DEF_Trigger_ConditionIE_Item_tags_1) + /sizeof(asn_DEF_Trigger_ConditionIE_Item_tags_1[0]), /* 1 */ + asn_DEF_Trigger_ConditionIE_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_Trigger_ConditionIE_Item_tags_1) + /sizeof(asn_DEF_Trigger_ConditionIE_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_Trigger_ConditionIE_Item_1, + 1, /* Elements count */ + &asn_SPC_Trigger_ConditionIE_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.h b/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.h new file mode 100644 index 000000000..91597e933 --- /dev/null +++ b/src/codec_utils/E2SMKPM/Trigger-ConditionIE-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2SM-KPM-IEs" + * found in "codeathon/E2SM_KPM.asn1" + * `asn1c -D ./codeathon/e2smkpm/ -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _Trigger_ConditionIE_Item_H_ +#define _Trigger_ConditionIE_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RT-Period-IE.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Trigger-ConditionIE-Item */ +typedef struct Trigger_ConditionIE_Item { + RT_Period_IE_t report_Period_IE; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Trigger_ConditionIE_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Trigger_ConditionIE_Item; +extern asn_SEQUENCE_specifics_t asn_SPC_Trigger_ConditionIE_Item_specs_1; +extern asn_TYPE_member_t asn_MBR_Trigger_ConditionIE_Item_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _Trigger_ConditionIE_Item_H_ */ +#include diff --git a/src/codec_utils/E2SMKPM/a.out b/src/codec_utils/E2SMKPM/a.out new file mode 100755 index 0000000000000000000000000000000000000000..31425adef0ed70ee2a474447fbf2d333d4f4a45d GIT binary patch literal 375344 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�{ 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 o>+dT4{|W<1KYvXBUQ. All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +typedef A_SEQUENCE_OF(void) asn_sequence; + +void +asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free) { + asn_sequence *as = (asn_sequence *)asn_sequence_of_x; + + if(as) { + void *ptr; + int n; + + if(number < 0 || number >= as->count) + return; /* Nothing to delete */ + + if(_do_free && as->free) { + ptr = as->array[number]; + } else { + ptr = 0; + } + + /* + * Shift all elements to the left to hide the gap. + */ + --as->count; + for(n = number; n < as->count; n++) + as->array[n] = as->array[n+1]; + + /* + * Invoke the third-party function only when the state + * of the parent structure is consistent. + */ + if(ptr) as->free(ptr); + } +} + diff --git a/src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.h b/src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.h new file mode 100644 index 000000000..e35bc447a --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_SEQUENCE_OF.h @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_SEQUENCE_OF_H +#define ASN_SEQUENCE_OF_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * SEQUENCE OF is the same as SET OF with a tiny difference: + * the delete operation preserves the initial order of elements + * and thus MAY operate in non-constant time. + */ +#define A_SEQUENCE_OF(type) A_SET_OF(type) + +#define ASN_SEQUENCE_ADD(headptr, ptr) \ + asn_sequence_add((headptr), (ptr)) + +/*********************************************** + * Implementation of the SEQUENCE OF structure. + */ + +#define asn_sequence_add asn_set_add +#define asn_sequence_empty asn_set_empty + +/* + * Delete the element from the set by its number (base 0). + * This is NOT a constant-time operation. + * The order of elements is preserved. + * If _do_free is given AND the (*free) is initialized, the element + * will be freed using the custom (*free) function as well. + */ +void asn_sequence_del(void *asn_sequence_of_x, int number, int _do_free); + +/* + * Cope with different conversions requirements to/from void in C and C++. + * This is mostly useful for support library. + */ +typedef A_SEQUENCE_OF(void) asn_anonymous_sequence_; +#define _A_SEQUENCE_FROM_VOID(ptr) ((asn_anonymous_sequence_ *)(ptr)) +#define _A_CSEQUENCE_FROM_VOID(ptr) ((const asn_anonymous_sequence_ *)(ptr)) + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_SEQUENCE_OF_H */ diff --git a/src/codec_utils/E2SMKPM/asn_SET_OF.c b/src/codec_utils/E2SMKPM/asn_SET_OF.c new file mode 100644 index 000000000..944f2cb8a --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_SET_OF.c @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Add another element into the set. + */ +int +asn_set_add(void *asn_set_of_x, void *ptr) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as == 0 || ptr == 0) { + errno = EINVAL; /* Invalid arguments */ + return -1; + } + + /* + * Make sure there's enough space to insert an element. + */ + if(as->count == as->size) { + int _newsize = as->size ? (as->size << 1) : 4; + void *_new_arr; + _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); + if(_new_arr) { + as->array = (void **)_new_arr; + as->size = _newsize; + } else { + /* ENOMEM */ + return -1; + } + } + + as->array[as->count++] = ptr; + + return 0; +} + +void +asn_set_del(void *asn_set_of_x, int number, int _do_free) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as) { + void *ptr; + if(number < 0 || number >= as->count) + return; + + if(_do_free && as->free) { + ptr = as->array[number]; + } else { + ptr = 0; + } + + as->array[number] = as->array[--as->count]; + + /* + * Invoke the third-party function only when the state + * of the parent structure is consistent. + */ + if(ptr) as->free(ptr); + } +} + +/* + * Free the contents of the set, do not free the set itself. + */ +void +asn_set_empty(void *asn_set_of_x) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as) { + if(as->array) { + if(as->free) { + while(as->count--) + as->free(as->array[as->count]); + } + FREEMEM(as->array); + as->array = 0; + } + as->count = 0; + as->size = 0; + } + +} + diff --git a/src/codec_utils/E2SMKPM/asn_SET_OF.h b/src/codec_utils/E2SMKPM/asn_SET_OF.h new file mode 100644 index 000000000..882e1a47d --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_SET_OF.h @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_SET_OF_H +#define ASN_SET_OF_H + +#ifdef __cplusplus +#define A_SET_OF(type) \ + struct { \ + type **array; \ + int count; /* Meaningful size */ \ + int size; /* Allocated size */ \ + void (*free)(decltype(*array)); \ + } +#else /* C */ +#define A_SET_OF(type) \ + struct { \ + type **array; \ + int count; /* Meaningful size */ \ + int size; /* Allocated size */ \ + void (*free)(type *); \ + } +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define ASN_SET_ADD(headptr, ptr) \ + asn_set_add((headptr), (ptr)) + +/******************************************* + * Implementation of the SET OF structure. + */ + +/* + * Add another structure into the set by its pointer. + * RETURN VALUES: + * 0 for success and -1/errno for failure. + */ +int asn_set_add(void *asn_set_of_x, void *ptr); + +/* + * Delete the element from the set by its number (base 0). + * This is a constant-time operation. The order of elements before the + * deleted ones is guaranteed, the order of elements after the deleted + * one is NOT guaranteed. + * If _do_free is given AND the (*free) is initialized, the element + * will be freed using the custom (*free) function as well. + */ +void asn_set_del(void *asn_set_of_x, int number, int _do_free); + +/* + * Empty the contents of the set. Will free the elements, if (*free) is given. + * Will NOT free the set itself. + */ +void asn_set_empty(void *asn_set_of_x); + +/* + * Cope with different conversions requirements to/from void in C and C++. + * This is mostly useful for support library. + */ +typedef A_SET_OF(void) asn_anonymous_set_; +#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) +#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_SET_OF_H */ diff --git a/src/codec_utils/E2SMKPM/asn_application.c b/src/codec_utils/E2SMKPM/asn_application.c new file mode 100644 index 000000000..2bff46064 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_application.c @@ -0,0 +1,481 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +static asn_enc_rval_t asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, + const asn_TYPE_descriptor_t *td, + const void *sptr, + asn_app_consume_bytes_f *callback, + void *callback_key); + + +struct callback_count_bytes_key { + asn_app_consume_bytes_f *callback; + void *callback_key; + size_t computed_size; +}; + +/* + * Encoder which just counts bytes that come through it. + */ +static int +callback_count_bytes_cb(const void *data, size_t size, void *keyp) { + struct callback_count_bytes_key *key = keyp; + int ret; + + ret = key->callback(data, size, key->callback_key); + if(ret >= 0) { + key->computed_size += size; + } + + return ret; +} + +struct overrun_encoder_key { + void *buffer; + size_t buffer_size; + size_t computed_size; +}; + +struct dynamic_encoder_key { + void *buffer; + size_t buffer_size; + size_t computed_size; +}; + +struct callback_failure_catch_key { + asn_app_consume_bytes_f *callback; + void *callback_key; + int callback_failed; +}; + +/* + * Encoder which doesn't stop counting bytes + * even if it reaches the end of the buffer. + */ +static int +overrun_encoder_cb(const void *data, size_t size, void *keyp) { + struct overrun_encoder_key *key = keyp; + + if(key->computed_size + size > key->buffer_size) { + /* + * Avoid accident on the next call: + * stop adding bytes to the buffer. + */ + key->buffer_size = 0; + } else { + memcpy((char *)key->buffer + key->computed_size, data, size); + } + key->computed_size += size; + + return 0; +} + +/* + * Encoder which dynamically allocates output, and continues + * to count even if allocation failed. + */ +static int +dynamic_encoder_cb(const void *data, size_t size, void *keyp) { + struct dynamic_encoder_key *key = keyp; + + if(key->buffer) { + if(key->computed_size + size >= key->buffer_size) { + void *p; + size_t new_size = key->buffer_size; + + do { + new_size *= 2; + } while(new_size <= key->computed_size + size); + + p = REALLOC(key->buffer, new_size); + if(p) { + key->buffer = p; + key->buffer_size = new_size; + } else { + FREEMEM(key->buffer); + key->buffer = 0; + key->buffer_size = 0; + key->computed_size += size; + return 0; + } + } + memcpy((char *)key->buffer + key->computed_size, data, size); + } + + key->computed_size += size; + + return 0; +} + +/* + * Encoder which help convert the application level encoder failure into EIO. + */ +static int +callback_failure_catch_cb(const void *data, size_t size, void *keyp) { + struct callback_failure_catch_key *key = keyp; + int ret; + + ret = key->callback(data, size, key->callback_key); + if(ret < 0) { + key->callback_failed = 1; + } + + return ret; +} + +asn_enc_rval_t +asn_encode(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, const asn_TYPE_descriptor_t *td, + const void *sptr, asn_app_consume_bytes_f *callback, void *callback_key) { + struct callback_failure_catch_key cb_key; + asn_enc_rval_t er = {0,0,0}; + + if(!callback) { + errno = EINVAL; + ASN__ENCODE_FAILED; + } + + cb_key.callback = callback; + cb_key.callback_key = callback_key; + cb_key.callback_failed = 0; + + er = asn_encode_internal(opt_codec_ctx, syntax, td, sptr, + callback_failure_catch_cb, &cb_key); + if(cb_key.callback_failed) { + assert(er.encoded == -1); + assert(errno == EBADF); + errno = EIO; + } + + return er; +} + +asn_enc_rval_t +asn_encode_to_buffer(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, + const asn_TYPE_descriptor_t *td, const void *sptr, + void *buffer, size_t buffer_size) { + struct overrun_encoder_key buf_key; + asn_enc_rval_t er = {0,0,0}; + + if(buffer_size > 0 && !buffer) { + errno = EINVAL; + ASN__ENCODE_FAILED; + } + + buf_key.buffer = buffer; + buf_key.buffer_size = buffer_size; + buf_key.computed_size = 0; + + er = asn_encode_internal(opt_codec_ctx, syntax, td, sptr, + overrun_encoder_cb, &buf_key); + + if(er.encoded >= 0 && (size_t)er.encoded != buf_key.computed_size) { + ASN_DEBUG("asn_encode() returned %" ASN_PRI_SSIZE + " yet produced %" ASN_PRI_SIZE " bytes", + er.encoded, buf_key.computed_size); + assert(er.encoded < 0 || (size_t)er.encoded == buf_key.computed_size); + } + + return er; +} + +asn_encode_to_new_buffer_result_t +asn_encode_to_new_buffer(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, + const asn_TYPE_descriptor_t *td, const void *sptr) { + struct dynamic_encoder_key buf_key; + asn_encode_to_new_buffer_result_t res; + + buf_key.buffer_size = 16; + buf_key.buffer = MALLOC(buf_key.buffer_size); + buf_key.computed_size = 0; + + res.result = asn_encode_internal(opt_codec_ctx, syntax, td, sptr, + dynamic_encoder_cb, &buf_key); + + if(res.result.encoded >= 0 + && (size_t)res.result.encoded != buf_key.computed_size) { + ASN_DEBUG("asn_encode() returned %" ASN_PRI_SSIZE + " yet produced %" ASN_PRI_SIZE " bytes", + res.result.encoded, buf_key.computed_size); + assert(res.result.encoded < 0 + || (size_t)res.result.encoded == buf_key.computed_size); + } + + res.buffer = buf_key.buffer; + + /* 0-terminate just in case. */ + if(res.buffer) { + assert(buf_key.computed_size < buf_key.buffer_size); + ((char *)res.buffer)[buf_key.computed_size] = '\0'; + } + + return res; +} + +static asn_enc_rval_t +asn_encode_internal(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, + const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_consume_bytes_f *callback, void *callback_key) { + asn_enc_rval_t er = {0,0,0}; + enum xer_encoder_flags_e xer_flags = XER_F_CANONICAL; + + (void)opt_codec_ctx; /* Parameters are not checked on encode yet. */ + + if(!td || !sptr) { + errno = EINVAL; + ASN__ENCODE_FAILED; + } + + switch(syntax) { + case ATS_NONSTANDARD_PLAINTEXT: + if(td->op->print_struct) { + struct callback_count_bytes_key cb_key; + cb_key.callback = callback; + cb_key.callback_key = callback_key; + cb_key.computed_size = 0; + if(td->op->print_struct(td, sptr, 1, callback_count_bytes_cb, + &cb_key) + < 0 + || callback_count_bytes_cb("\n", 1, &cb_key) < 0) { + errno = EBADF; /* Structure has incorrect form. */ + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; + } else { + er.encoded = cb_key.computed_size; + er.failed_type = 0; + er.structure_ptr = 0; + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; + + case ATS_RANDOM: + errno = ENOENT; /* Randomization doesn't make sense on output. */ + ASN__ENCODE_FAILED; + + case ATS_BER: + /* BER is a superset of DER. */ + /* Fall through. */ + case ATS_DER: + if(td->op->der_encoder) { + er = der_encode(td, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->der_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* DER is not defined for this type. */ + } + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; + case ATS_CER: + errno = ENOENT; /* Transfer syntax is not defined for any type. */ + ASN__ENCODE_FAILED; + +#ifdef ASN_DISABLE_OER_SUPPORT + case ATS_BASIC_OER: + case ATS_CANONICAL_OER: + errno = ENOENT; /* PER is not defined. */ + ASN__ENCODE_FAILED; + break; +#else /* ASN_DISABLE_OER_SUPPORT */ + case ATS_BASIC_OER: + /* CANONICAL-OER is a superset of BASIC-OER. */ + /* Fall through. */ + case ATS_CANONICAL_OER: + if(td->op->oer_encoder) { + er = oer_encode(td, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->oer_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* OER is not defined for this type. */ + } + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; +#endif /* ASN_DISABLE_OER_SUPPORT */ + +#ifdef ASN_DISABLE_PER_SUPPORT + case ATS_UNALIGNED_BASIC_PER: + case ATS_UNALIGNED_CANONICAL_PER: + case ATS_ALIGNED_BASIC_PER: + case ATS_ALIGNED_CANONICAL_PER: + errno = ENOENT; /* PER is not defined. */ + ASN__ENCODE_FAILED; + break; +#else /* ASN_DISABLE_PER_SUPPORT */ + case ATS_UNALIGNED_BASIC_PER: + /* CANONICAL-UPER is a superset of BASIC-UPER. */ + /* Fall through. */ + case ATS_UNALIGNED_CANONICAL_PER: + if(td->op->uper_encoder) { + er = uper_encode(td, 0, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->uper_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* UPER is not defined for this type. */ + } + } else { + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + if(er.encoded == 0) { + /* Enforce "Complete Encoding" of X.691 #11.1 */ + if(callback("\0", 1, callback_key) < 0) { + errno = EBADF; + ASN__ENCODE_FAILED; + } + er.encoded = 8; /* Exactly 8 zero bits is added. */ + } + /* Convert bits into bytes */ + er.encoded = (er.encoded + 7) >> 3; + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; + case ATS_ALIGNED_BASIC_PER: + /* CANONICAL-APER is a superset of BASIC-APER. */ + /* Fall through. */ + case ATS_ALIGNED_CANONICAL_PER: + if(td->op->aper_encoder) { + er = aper_encode(td, 0, sptr, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->aper_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* APER is not defined for this type. */ + } + } else { + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + if(er.encoded == 0) { + /* Enforce "Complete Encoding" of X.691 #11.1 */ + if(callback("\0", 1, callback_key) < 0) { + errno = EBADF; + ASN__ENCODE_FAILED; + } + er.encoded = 8; /* Exactly 8 zero bits is added. */ + } + /* Convert bits into bytes */ + er.encoded = (er.encoded + 7) >> 3; + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; +#endif /* ASN_DISABLE_PER_SUPPORT */ + + case ATS_BASIC_XER: + /* CANONICAL-XER is a superset of BASIC-XER. */ + xer_flags &= ~XER_F_CANONICAL; + xer_flags |= XER_F_BASIC; + /* Fall through. */ + case ATS_CANONICAL_XER: + if(td->op->xer_encoder) { + er = xer_encode(td, sptr, xer_flags, callback, callback_key); + if(er.encoded == -1) { + if(er.failed_type && er.failed_type->op->xer_encoder) { + errno = EBADF; /* Structure has incorrect form. */ + } else { + errno = ENOENT; /* XER is not defined for this type. */ + } + } + } else { + errno = ENOENT; /* Transfer syntax is not defined for this type. */ + ASN__ENCODE_FAILED; + } + break; + + default: + errno = ENOENT; + ASN__ENCODE_FAILED; + } + + return er; +} + +asn_dec_rval_t +asn_decode(const asn_codec_ctx_t *opt_codec_ctx, + enum asn_transfer_syntax syntax, const asn_TYPE_descriptor_t *td, + void **sptr, const void *buffer, size_t size) { + if(!td || !td->op || !sptr || (size && !buffer)) { + ASN__DECODE_FAILED; + } + + switch(syntax) { + case ATS_CER: + case ATS_NONSTANDARD_PLAINTEXT: + default: + errno = ENOENT; + ASN__DECODE_FAILED; + + case ATS_RANDOM: + if(!td->op->random_fill) { + ASN__DECODE_FAILED; + } else { + if(asn_random_fill(td, sptr, 16000) == 0) { + asn_dec_rval_t ret = {RC_OK, 0}; + return ret; + } else { + ASN__DECODE_FAILED; + } + } + break; + + case ATS_DER: + case ATS_BER: + return ber_decode(opt_codec_ctx, td, sptr, buffer, size); + + case ATS_BASIC_OER: + case ATS_CANONICAL_OER: +#ifdef ASN_DISABLE_OER_SUPPORT + errno = ENOENT; + ASN__DECODE_FAILED; +#else + return oer_decode(opt_codec_ctx, td, sptr, buffer, size); +#endif + + case ATS_UNALIGNED_BASIC_PER: + case ATS_UNALIGNED_CANONICAL_PER: +#ifdef ASN_DISABLE_PER_SUPPORT + errno = ENOENT; + ASN__DECODE_FAILED; +#else + return uper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#endif + + case ATS_ALIGNED_BASIC_PER: + case ATS_ALIGNED_CANONICAL_PER: +#ifdef ASN_DISABLE_PER_SUPPORT + errno = ENOENT; + ASN__DECODE_FAILED; +#else + return aper_decode_complete(opt_codec_ctx, td, sptr, buffer, size); +#endif + + case ATS_BASIC_XER: + case ATS_CANONICAL_XER: + return xer_decode(opt_codec_ctx, td, sptr, buffer, size); + } +} + diff --git a/src/codec_utils/E2SMKPM/asn_application.h b/src/codec_utils/E2SMKPM/asn_application.h new file mode 100644 index 000000000..034f64612 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_application.h @@ -0,0 +1,171 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Application-level ASN.1 callbacks. + */ +#ifndef ASN_APPLICATION_H +#define ASN_APPLICATION_H + +#include "asn_system.h" /* for platform-dependent types */ +#include "asn_codecs.h" /* for ASN.1 codecs specifics */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * A selection of ASN.1 Transfer Syntaxes to use with generalized + * encoders and decoders declared further in this .h file. + */ +enum asn_transfer_syntax { + /* Avoid appearance of a default transfer syntax. */ + ATS_INVALID = 0, + /* Plaintext output (not conforming to any standard), for debugging. */ + ATS_NONSTANDARD_PLAINTEXT, + /* Returns a randomly generated structure. */ + ATS_RANDOM, + /* + * X.690: + * BER: Basic Encoding Rules. + * DER: Distinguished Encoding Rules. + * CER: Canonical Encoding Rules. + * DER and CER are more strict variants of BER. + */ + ATS_BER, + ATS_DER, + ATS_CER, /* Only decoding is supported */ + /* + * X.696: + * OER: Octet Encoding Rules. + * CANONICAL-OER is a more strict variant of BASIC-OER. + */ + ATS_BASIC_OER, + ATS_CANONICAL_OER, + /* + * X.691: + * PER: Packed Encoding Rules. + * CANONICAL-PER is a more strict variant of BASIC-PER. + * NOTE: Produces or consumes a complete encoding (X.691 (08/2015) #11.1). + */ + ATS_UNALIGNED_BASIC_PER, + ATS_UNALIGNED_CANONICAL_PER, + ATS_ALIGNED_BASIC_PER, + ATS_ALIGNED_CANONICAL_PER, + /* + * X.693: + * XER: XML Encoding Rules. + * CANONICAL-XER is a more strict variant of BASIC-XER. + */ + ATS_BASIC_XER, + ATS_CANONICAL_XER +}; + +/* + * A generic encoder for any supported transfer syntax. + * RETURN VALUES: + * The (.encoded) field of the return value is REDEFINED to mean the following: + * >=0: The computed size of the encoded data. Can exceed the (buffer_size). + * -1: Error encoding the structure. See the error code in (errno): + * EINVAL: Incorrect parameters to the function, such as NULLs. + * ENOENT: Encoding transfer syntax is not defined (for this type). + * EBADF: The structure has invalid form or content constraint failed. + * The (.failed_type) and (.structure_ptr) MIGHT be set to the appropriate + * values at the place of failure, if at all possible. + * WARNING: The (.encoded) field of the return value can exceed the buffer_size. + * This is similar to snprintf(3) contract which might return values + * greater than the buffer size. + */ +asn_enc_rval_t asn_encode_to_buffer( + const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */ + enum asn_transfer_syntax, + const struct asn_TYPE_descriptor_s *type_to_encode, + const void *structure_to_encode, void *buffer, size_t buffer_size); + +/* + * A variant of asn_encode_to_buffer() with automatically allocated buffer. + * RETURN VALUES: + * On success, returns a newly allocated (.buffer) containing the whole message. + * The message size is returned in (.result.encoded). + * On failure: + * (.buffer) is NULL, + * (.result.encoded) as in asn_encode_to_buffer(), + * The errno codes as in asn_encode_to_buffer(), plus the following: + * ENOMEM: Memory allocation failed due to system or internal limits. + * The user is responsible for freeing the (.buffer). + */ +typedef struct asn_encode_to_new_buffer_result_s { + void *buffer; /* NULL if failed to encode. */ + asn_enc_rval_t result; +} asn_encode_to_new_buffer_result_t; +asn_encode_to_new_buffer_result_t asn_encode_to_new_buffer( + const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */ + enum asn_transfer_syntax, + const struct asn_TYPE_descriptor_s *type_to_encode, + const void *structure_to_encode); + + +/* + * Generic type of an application-defined callback to return various + * types of data to the application. + * EXPECTED RETURN VALUES: + * -1: Failed to consume bytes. Abort the mission. + * Non-negative return values indicate success, and ignored. + */ +typedef int(asn_app_consume_bytes_f)(const void *buffer, size_t size, + void *application_specific_key); + + +/* + * A generic encoder for any supported transfer syntax. + * Returns the comprehensive encoding result descriptor (see asn_codecs.h). + * RETURN VALUES: + * The negative (.encoded) field of the return values is accompanied with the + * following error codes (errno): + * EINVAL: Incorrect parameters to the function, such as NULLs. + * ENOENT: Encoding transfer syntax is not defined (for this type). + * EBADF: The structure has invalid form or content constraint failed. + * EIO: The (callback) has returned negative value during encoding. + */ +asn_enc_rval_t asn_encode( + const asn_codec_ctx_t *opt_codec_parameters, /* See asn_codecs.h */ + enum asn_transfer_syntax, + const struct asn_TYPE_descriptor_s *type_to_encode, + const void *structure_to_encode, + asn_app_consume_bytes_f *callback, void *callback_key); + + +/* + * A generic decoder for any supported transfer syntax. + */ +asn_dec_rval_t asn_decode( + const asn_codec_ctx_t *opt_codec_parameters, enum asn_transfer_syntax, + const struct asn_TYPE_descriptor_s *type_to_decode, + void **structure_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ +); + + +/* + * A callback of this type is called whenever constraint validation fails + * on some ASN.1 type. See "constraints.h" for more details on constraint + * validation. + * This callback specifies a descriptor of the ASN.1 type which failed + * the constraint check, as well as human readable message on what + * particular constraint has failed. + */ +typedef void (asn_app_constraint_failed_f)(void *application_specific_key, + const struct asn_TYPE_descriptor_s *type_descriptor_which_failed, + const void *structure_which_failed_ptr, + const char *error_message_format, ...) CC_PRINTFLIKE(4, 5); + + +#ifdef __cplusplus +} +#endif + +#include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */ + +#endif /* ASN_APPLICATION_H */ diff --git a/src/codec_utils/E2SMKPM/asn_bit_data.c b/src/codec_utils/E2SMKPM/asn_bit_data.c new file mode 100644 index 000000000..fe4b89ba7 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_bit_data.c @@ -0,0 +1,333 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Create a contiguous non-refillable bit data structure. + * Can be freed by FREEMEM(). + */ +asn_bit_data_t * +asn_bit_data_new_contiguous(const void *data, size_t size_bits) { + size_t size_bytes = (size_bits + 7) / 8; + asn_bit_data_t *pd; + uint8_t *bytes; + + /* Get the extensions map */ + pd = CALLOC(1, sizeof(*pd) + size_bytes + 1); + if(!pd) { + return NULL; + } + bytes = (void *)(((char *)pd) + sizeof(*pd)); + memcpy(bytes, data, size_bytes); + bytes[size_bytes] = 0; + pd->buffer = bytes; + pd->nboff = 0; + pd->nbits = size_bits; + + return pd; +} + + +char * +asn_bit_data_string(asn_bit_data_t *pd) { + static char buf[2][32]; + static int n; + n = (n+1) % 2; + snprintf(buf[n], sizeof(buf[n]), + "{m=%" ASN_PRI_SIZE " span %" ASN_PRI_SIZE "[%" ASN_PRI_SIZE + "..%" ASN_PRI_SIZE "] (%" ASN_PRI_SIZE ")}", + pd->moved, ((uintptr_t)(pd->buffer) & 0xf), pd->nboff, pd->nbits, + pd->nbits - pd->nboff); + return buf[n]; +} + +void +asn_get_undo(asn_bit_data_t *pd, int nbits) { + if((ssize_t)pd->nboff < nbits) { + assert((ssize_t)pd->nboff < nbits); + } else { + pd->nboff -= nbits; + pd->moved -= nbits; + } +} + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + */ +int32_t +asn_get_few_bits(asn_bit_data_t *pd, int nbits) { + size_t off; /* Next after last bit offset */ + ssize_t nleft; /* Number of bits left in this stream */ + uint32_t accum; + const uint8_t *buf; + + if(nbits < 0) + return -1; + + nleft = pd->nbits - pd->nboff; + if(nbits > nleft) { + int32_t tailv, vhead; + if(!pd->refill || nbits > 31) return -1; + /* Accumulate unused bytes before refill */ + ASN_DEBUG("Obtain the rest %d bits (want %d)", + (int)nleft, (int)nbits); + tailv = asn_get_few_bits(pd, nleft); + if(tailv < 0) return -1; + /* Refill (replace pd contents with new data) */ + if(pd->refill(pd)) + return -1; + nbits -= nleft; + vhead = asn_get_few_bits(pd, nbits); + /* Combine the rest of previous pd with the head of new one */ + tailv = (tailv << nbits) | vhead; /* Could == -1 */ + return tailv; + } + + /* + * Normalize position indicator. + */ + if(pd->nboff >= 8) { + pd->buffer += (pd->nboff >> 3); + pd->nbits -= (pd->nboff & ~0x07); + pd->nboff &= 0x07; + } + pd->moved += nbits; + pd->nboff += nbits; + off = pd->nboff; + buf = pd->buffer; + + /* + * Extract specified number of bits. + */ + if(off <= 8) + accum = nbits ? (buf[0]) >> (8 - off) : 0; + else if(off <= 16) + accum = ((buf[0] << 8) + buf[1]) >> (16 - off); + else if(off <= 24) + accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); + else if(off <= 31) + accum = (((uint32_t)buf[0] << 24) + (buf[1] << 16) + + (buf[2] << 8) + (buf[3])) >> (32 - off); + else if(nbits <= 31) { + asn_bit_data_t tpd = *pd; + /* Here are we with our 31-bits limit plus 1..7 bits offset. */ + asn_get_undo(&tpd, nbits); + /* The number of available bits in the stream allow + * for the following operations to take place without + * invoking the ->refill() function */ + accum = asn_get_few_bits(&tpd, nbits - 24) << 24; + accum |= asn_get_few_bits(&tpd, 24); + } else { + asn_get_undo(pd, nbits); + return -1; + } + + accum &= (((uint32_t)1 << nbits) - 1); + + ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+ld[%d..%d]:%02x (%d) => 0x%x]", + (int)nbits, (int)nleft, + (int)pd->moved, + (((long)pd->buffer) & 0xf), + (int)pd->nboff, (int)pd->nbits, + ((pd->buffer != NULL)?pd->buffer[0]:0), + (int)(pd->nbits - pd->nboff), + (int)accum); + + return accum; +} + +/* + * Extract a large number of bits from the specified PER data pointer. + */ +int +asn_get_many_bits(asn_bit_data_t *pd, uint8_t *dst, int alright, int nbits) { + int32_t value; + + if(alright && (nbits & 7)) { + /* Perform right alignment of a first few bits */ + value = asn_get_few_bits(pd, nbits & 0x07); + if(value < 0) return -1; + *dst++ = value; /* value is already right-aligned */ + nbits &= ~7; + } + + while(nbits) { + if(nbits >= 24) { + value = asn_get_few_bits(pd, 24); + if(value < 0) return -1; + *(dst++) = value >> 16; + *(dst++) = value >> 8; + *(dst++) = value; + nbits -= 24; + } else { + value = asn_get_few_bits(pd, nbits); + if(value < 0) return -1; + if(nbits & 7) { /* implies left alignment */ + value <<= 8 - (nbits & 7), + nbits += 8 - (nbits & 7); + if(nbits > 24) + *dst++ = value >> 24; + } + if(nbits > 16) + *dst++ = value >> 16; + if(nbits > 8) + *dst++ = value >> 8; + *dst++ = value; + break; + } + } + + return 0; +} + +/* + * Put a small number of bits (<= 31). + */ +int +asn_put_few_bits(asn_bit_outp_t *po, uint32_t bits, int obits) { + size_t off; /* Next after last bit offset */ + size_t omsk; /* Existing last byte meaningful bits mask */ + uint8_t *buf; + + if(obits <= 0 || obits >= 32) return obits ? -1 : 0; + + ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", + obits, (int)bits, (void *)po->buffer, (int)po->nboff); + + /* + * Normalize position indicator. + */ + if(po->nboff >= 8) { + po->buffer += (po->nboff >> 3); + po->nbits -= (po->nboff & ~0x07); + po->nboff &= 0x07; + } + + /* + * Flush whole-bytes output, if necessary. + */ + if(po->nboff + obits > po->nbits) { + size_t complete_bytes; + if(!po->buffer) po->buffer = po->tmpspace; + complete_bytes = (po->buffer - po->tmpspace); + ASN_DEBUG("[PER output %ld complete + %ld]", + (long)complete_bytes, (long)po->flushed_bytes); + if(po->output(po->tmpspace, complete_bytes, po->op_key) < 0) + return -1; + if(po->nboff) + po->tmpspace[0] = po->buffer[0]; + po->buffer = po->tmpspace; + po->nbits = 8 * sizeof(po->tmpspace); + po->flushed_bytes += complete_bytes; + } + + /* + * Now, due to sizeof(tmpspace), we are guaranteed large enough space. + */ + buf = po->buffer; + omsk = ~((1 << (8 - po->nboff)) - 1); + off = (po->nboff + obits); + + /* Clear data of debris before meaningful bits */ + bits &= (((uint32_t)1 << obits) - 1); + + ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, + (int)bits, (int)bits, + (int)po->nboff, (int)off, + buf[0], (int)(omsk&0xff), + (int)(buf[0] & omsk)); + + if(off <= 8) /* Completely within 1 byte */ + po->nboff = off, + bits <<= (8 - off), + buf[0] = (buf[0] & omsk) | bits; + else if(off <= 16) + po->nboff = off, + bits <<= (16 - off), + buf[0] = (buf[0] & omsk) | (bits >> 8), + buf[1] = bits; + else if(off <= 24) + po->nboff = off, + bits <<= (24 - off), + buf[0] = (buf[0] & omsk) | (bits >> 16), + buf[1] = bits >> 8, + buf[2] = bits; + else if(off <= 31) + po->nboff = off, + bits <<= (32 - off), + buf[0] = (buf[0] & omsk) | (bits >> 24), + buf[1] = bits >> 16, + buf[2] = bits >> 8, + buf[3] = bits; + else { + if(asn_put_few_bits(po, bits >> (obits - 24), 24)) return -1; + if(asn_put_few_bits(po, bits, obits - 24)) return -1; + } + + ASN_DEBUG("[PER out %u/%x => %02x buf+%ld]", + (int)bits, (int)bits, buf[0], + (long)(po->buffer - po->tmpspace)); + + return 0; +} + + +/* + * Output a large number of bits. + */ +int +asn_put_many_bits(asn_bit_outp_t *po, const uint8_t *src, int nbits) { + + while(nbits) { + uint32_t value; + + if(nbits >= 24) { + value = (src[0] << 16) | (src[1] << 8) | src[2]; + src += 3; + nbits -= 24; + if(asn_put_few_bits(po, value, 24)) + return -1; + } else { + value = src[0]; + if(nbits > 8) + value = (value << 8) | src[1]; + if(nbits > 16) + value = (value << 8) | src[2]; + if(nbits & 0x07) + value >>= (8 - (nbits & 0x07)); + if(asn_put_few_bits(po, value, nbits)) + return -1; + break; + } + } + + return 0; +} + + +int +asn_put_aligned_flush(asn_bit_outp_t *po) { + uint32_t unused_bits = (0x7 & (8 - (po->nboff & 0x07))); + size_t complete_bytes = + (po->buffer ? po->buffer - po->tmpspace : 0) + ((po->nboff + 7) >> 3); + + if(unused_bits) { + po->buffer[po->nboff >> 3] &= ~0u << unused_bits; + } + + if(po->output(po->tmpspace, complete_bytes, po->op_key) < 0) { + return -1; + } else { + po->buffer = po->tmpspace; + po->nboff = 0; + po->nbits = 8 * sizeof(po->tmpspace); + po->flushed_bytes += complete_bytes; + return 0; + } +} + diff --git a/src/codec_utils/E2SMKPM/asn_bit_data.h b/src/codec_utils/E2SMKPM/asn_bit_data.h new file mode 100644 index 000000000..59de7af5f --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_bit_data.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_BIT_DATA +#define ASN_BIT_DATA + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This structure describes a position inside an incoming PER bit stream. + */ +typedef struct asn_bit_data_s { + const uint8_t *buffer; /* Pointer to the octet stream */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits in the stream */ + size_t moved; /* Number of bits moved through this bit stream */ + int (*refill)(struct asn_bit_data_s *); + void *refill_key; +} asn_bit_data_t; + +/* + * Create a contiguous non-refillable bit data structure. + * Can be freed by FREEMEM(). + */ +asn_bit_data_t *asn_bit_data_new_contiguous(const void *data, size_t size_bits); + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int32_t asn_get_few_bits(asn_bit_data_t *, int get_nbits); + +/* Undo the immediately preceeding "get_few_bits" operation */ +void asn_get_undo(asn_bit_data_t *, int get_nbits); + +/* + * Extract a large number of bits from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int asn_get_many_bits(asn_bit_data_t *, uint8_t *dst, int right_align, + int get_nbits); + +/* Non-thread-safe debugging function, don't use it */ +char *asn_bit_data_string(asn_bit_data_t *); + +/* + * This structure supports forming bit output. + */ +typedef struct asn_bit_outp_s { + uint8_t *buffer; /* Pointer into the (tmpspace) */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits left in (tmpspace) */ + uint8_t tmpspace[32]; /* Preliminary storage to hold data */ + int (*output)(const void *data, size_t size, void *op_key); + void *op_key; /* Key for (output) data callback */ + size_t flushed_bytes; /* Bytes already flushed through (output) */ +} asn_bit_outp_t; + +/* Output a small number of bits (<= 31) */ +int asn_put_few_bits(asn_bit_outp_t *, uint32_t bits, int obits); + +/* Output a large number of bits */ +int asn_put_many_bits(asn_bit_outp_t *, const uint8_t *src, int put_nbits); + +/* + * Flush whole bytes (0 or more) through (outper) member. + * The least significant bits which are not used are guaranteed to be set to 0. + * Returns -1 if callback returns -1. Otherwise, 0. + */ +int asn_put_aligned_flush(asn_bit_outp_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_BIT_DATA */ diff --git a/src/codec_utils/E2SMKPM/asn_codecs.h b/src/codec_utils/E2SMKPM/asn_codecs.h new file mode 100644 index 000000000..e75c2709c --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_codecs.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_H +#define ASN_CODECS_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * This structure defines a set of parameters that may be passed + * to every ASN.1 encoder or decoder function. + * WARNING: if max_stack_size member is set, and you are calling the + * function pointers of the asn_TYPE_descriptor_t directly, + * this structure must be ALLOCATED ON THE STACK! + * If you can't always satisfy this requirement, use ber_decode(), + * xer_decode() and uper_decode() functions instead. + */ +typedef struct asn_codec_ctx_s { + /* + * Limit the decoder routines to use no (much) more stack than a given + * number of bytes. Most of decoders are stack-based, and this + * would protect against stack overflows if the number of nested + * encodings is high. + * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, + * and are safe from this kind of overflow. + * A value from getrlimit(RLIMIT_STACK) may be used to initialize + * this variable. Be careful in multithreaded environments, as the + * stack size is rather limited. + */ + size_t max_stack_size; /* 0 disables stack bounds checking */ +} asn_codec_ctx_t; + +/* + * Type of the return value of the encoding functions (der_encode, xer_encode). + */ +typedef struct asn_enc_rval_s { + /* + * Number of bytes encoded. + * -1 indicates failure to encode the structure. + * In this case, the members below this one are meaningful. + */ + ssize_t encoded; + + /* + * Members meaningful when (encoded == -1), for post mortem analysis. + */ + + /* Type which cannot be encoded */ + const struct asn_TYPE_descriptor_s *failed_type; + + /* Pointer to the structure of that type */ + const void *structure_ptr; +} asn_enc_rval_t; +#define ASN__ENCODE_FAILED do { \ + asn_enc_rval_t tmp_error; \ + tmp_error.encoded = -1; \ + tmp_error.failed_type = td; \ + tmp_error.structure_ptr = sptr; \ + ASN_DEBUG("Failed to encode element %s", td ? td->name : ""); \ + return tmp_error; \ +} while(0) +#define ASN__ENCODED_OK(rval) do { \ + rval.structure_ptr = 0; \ + rval.failed_type = 0; \ + return rval; \ +} while(0) + +/* + * Type of the return value of the decoding functions (ber_decode, xer_decode) + * + * Please note that the number of consumed bytes is ALWAYS meaningful, + * even if code==RC_FAIL. This is to indicate the number of successfully + * decoded bytes, hence providing a possibility to fail with more diagnostics + * (i.e., print the offending remainder of the buffer). + */ +enum asn_dec_rval_code_e { + RC_OK, /* Decoded successfully */ + RC_WMORE, /* More data expected, call again */ + RC_FAIL /* Failure to decode data */ +}; +typedef struct asn_dec_rval_s { + enum asn_dec_rval_code_e code; /* Result code */ + size_t consumed; /* Number of bytes consumed */ +} asn_dec_rval_t; +#define ASN__DECODE_FAILED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_FAIL; \ + tmp_error.consumed = 0; \ + ASN_DEBUG("Failed to decode element %s", td ? td->name : ""); \ + return tmp_error; \ +} while(0) +#define ASN__DECODE_STARVED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_WMORE; \ + tmp_error.consumed = 0; \ + return tmp_error; \ +} while(0) + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_CODECS_H */ diff --git a/src/codec_utils/E2SMKPM/asn_codecs_prim.c b/src/codec_utils/E2SMKPM/asn_codecs_prim.c new file mode 100644 index 000000000..fc2424773 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_codecs_prim.c @@ -0,0 +1,317 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Decode an always-primitive type. + */ +asn_dec_rval_t +ber_decode_primitive(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const void *buf_ptr, size_t size, int tag_mode) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; + asn_dec_rval_t rval; + ber_tlv_len_t length = 0; /* =0 to avoid [incorrect] warning. */ + + /* + * If the structure is not there, allocate it. + */ + if(st == NULL) { + st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st)); + if(st == NULL) ASN__DECODE_FAILED; + *sptr = (void *)st; + } + + ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", + td->name, tag_mode); + + /* + * Check tags and extract value length. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + st->size = (int)length; + /* The following better be optimized away. */ + if(sizeof(st->size) != sizeof(length) + && (ber_tlv_len_t)st->size != length) { + st->size = 0; + ASN__DECODE_FAILED; + } + + st->buf = (uint8_t *)MALLOC(length + 1); + if(!st->buf) { + st->size = 0; + ASN__DECODE_FAILED; + } + + memcpy(st->buf, buf_ptr, length); + st->buf[length] = '\0'; /* Just in case */ + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s", + (long)rval.consumed, + (long)length, td->name); + + return rval; +} + +/* + * Encode an always-primitive type using DER. + */ +asn_enc_rval_t +der_encode_primitive(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval = {0,0,0}; + const ASN__PRIMITIVE_TYPE_t *st = (const ASN__PRIMITIVE_TYPE_t *)sptr; + + ASN_DEBUG("%s %s as a primitive type (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, + cb, app_key); + ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb && st->buf) { + if(cb(st->buf, st->size, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + ASN__ENCODED_OK(erval); +} + +void +ASN__PRIMITIVE_TYPE_free(const asn_TYPE_descriptor_t *td, void *sptr, + enum asn_struct_free_method method) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as a primitive type", td->name); + + if(st->buf) + FREEMEM(st->buf); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(sptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(sptr, 0, sizeof(ASN__PRIMITIVE_TYPE_t)); + break; + } +} + + +/* + * Local internal type passed around as an argument. + */ +struct xdp_arg_s { + const asn_TYPE_descriptor_t *type_descriptor; + void *struct_key; + xer_primitive_body_decoder_f *prim_body_decoder; + int decoded_something; + int want_more; +}; + +/* + * Since some kinds of primitive values can be encoded using value-specific + * tags (, , etc), the primitive decoder must + * be supplied with such tags to parse them as needed. + */ +static int +xer_decode__unexpected_tag(void *key, const void *chunk_buf, size_t chunk_size) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + enum xer_pbd_rval bret; + + /* + * The chunk_buf is guaranteed to start at '<'. + */ + assert(chunk_size && ((const char *)chunk_buf)[0] == 0x3c); + + /* + * Decoding was performed once already. Prohibit doing it again. + */ + if(arg->decoded_something) + return -1; + + bret = arg->prim_body_decoder(arg->type_descriptor, + arg->struct_key, chunk_buf, chunk_size); + switch(bret) { + case XPBD_SYSTEM_FAILURE: + case XPBD_DECODER_LIMIT: + case XPBD_BROKEN_ENCODING: + break; + case XPBD_BODY_CONSUMED: + /* Tag decoded successfully */ + arg->decoded_something = 1; + /* Fall through */ + case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ + return 0; + } + + return -1; +} + +static ssize_t +xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + enum xer_pbd_rval bret; + size_t lead_wsp_size; + + if(arg->decoded_something) { + if(xer_whitespace_span(chunk_buf, chunk_size) == chunk_size) { + /* + * Example: + * "123 " + * ^- chunk_buf position. + */ + return chunk_size; + } + /* + * Decoding was done once already. Prohibit doing it again. + */ + return -1; + } + + if(!have_more) { + /* + * If we've received something like "1", we can't really + * tell whether it is really `1` or `123`, until we know + * that there is no more data coming. + * The have_more argument will be set to 1 once something + * like this is available to the caller of this callback: + * "1want_more = 1; + return -1; + } + + lead_wsp_size = xer_whitespace_span(chunk_buf, chunk_size); + chunk_buf = (const char *)chunk_buf + lead_wsp_size; + chunk_size -= lead_wsp_size; + + bret = arg->prim_body_decoder(arg->type_descriptor, + arg->struct_key, chunk_buf, chunk_size); + switch(bret) { + case XPBD_SYSTEM_FAILURE: + case XPBD_DECODER_LIMIT: + case XPBD_BROKEN_ENCODING: + break; + case XPBD_BODY_CONSUMED: + /* Tag decoded successfully */ + arg->decoded_something = 1; + /* Fall through */ + case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ + return lead_wsp_size + chunk_size; + } + + return -1; +} + + +asn_dec_rval_t +xer_decode_primitive(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + size_t struct_size, const char *opt_mname, + const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder) { + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t s_ctx; + struct xdp_arg_s s_arg; + asn_dec_rval_t rc; + + /* + * Create the structure if does not exist. + */ + if(!*sptr) { + *sptr = CALLOC(1, struct_size); + if(!*sptr) ASN__DECODE_FAILED; + } + + memset(&s_ctx, 0, sizeof(s_ctx)); + s_arg.type_descriptor = td; + s_arg.struct_key = *sptr; + s_arg.prim_body_decoder = prim_body_decoder; + s_arg.decoded_something = 0; + s_arg.want_more = 0; + + rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, + xml_tag, buf_ptr, size, + xer_decode__unexpected_tag, xer_decode__primitive_body); + switch(rc.code) { + case RC_OK: + if(!s_arg.decoded_something) { + char ch; + ASN_DEBUG("Primitive body is not recognized, " + "supplying empty one"); + /* + * Decoding opportunity has come and gone. + * Where's the result? + * Try to feed with empty body, see if it eats it. + */ + if(prim_body_decoder(s_arg.type_descriptor, + s_arg.struct_key, &ch, 0) + != XPBD_BODY_CONSUMED) { + /* + * This decoder does not like empty stuff. + */ + ASN__DECODE_FAILED; + } + } + break; + case RC_WMORE: + /* + * Redo the whole thing later. + * We don't have a context to save intermediate parsing state. + */ + rc.consumed = 0; + break; + case RC_FAIL: + rc.consumed = 0; + if(s_arg.want_more) + rc.code = RC_WMORE; + else + ASN__DECODE_FAILED; + break; + } + return rc; +} + diff --git a/src/codec_utils/E2SMKPM/asn_codecs_prim.h b/src/codec_utils/E2SMKPM/asn_codecs_prim.h new file mode 100644 index 000000000..fbc557648 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_codecs_prim.h @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_PRIM_H +#define ASN_CODECS_PRIM_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ASN__PRIMITIVE_TYPE_s { + uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ + size_t size; /* Size of the buffer */ +} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ + +asn_struct_free_f ASN__PRIMITIVE_TYPE_free; +ber_type_decoder_f ber_decode_primitive; +der_type_encoder_f der_encode_primitive; + +/* + * A callback specification for the xer_decode_primitive() function below. + */ +enum xer_pbd_rval { + XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ + XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ + XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ + XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ + XPBD_BODY_CONSUMED /* Body is recognized and consumed */ +}; +typedef enum xer_pbd_rval(xer_primitive_body_decoder_f)( + const asn_TYPE_descriptor_t *td, void *struct_ptr, const void *chunk_buf, + size_t chunk_size); + +/* + * Specific function to decode simple primitive types. + * Also see xer_decode_general() in xer_decoder.h + */ +asn_dec_rval_t xer_decode_primitive( + const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, + size_t struct_size, const char *opt_mname, const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder); + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_CODECS_PRIM_H */ diff --git a/src/codec_utils/E2SMKPM/asn_constant.h b/src/codec_utils/E2SMKPM/asn_constant.h new file mode 100644 index 000000000..cc80b45fd --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_constant.h @@ -0,0 +1,27 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + */ + +#ifndef _ASN_CONSTANT_H +#define _ASN_CONSTANT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define maxofMessageProtocolTests (15) +#define maxofRICstyles (63) +#define maxnoofQCI (256) +#define maxnoofQoSFlows (64) +#define maxnoofSliceItems (1024) +#define maxnoofContainerListItems (3) +#define maxCellingNBDU (512) +#define maxofContainers (8) +#define maxPLMN (12) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ASN_CONSTANT_H */ diff --git a/src/codec_utils/E2SMKPM/asn_internal.c b/src/codec_utils/E2SMKPM/asn_internal.c new file mode 100644 index 000000000..1aff95f80 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_internal.c @@ -0,0 +1,48 @@ +#include + +ssize_t +asn__format_to_callback(int (*cb)(const void *, size_t, void *key), void *key, + const char *fmt, ...) { + char scratch[64]; + char *buf = scratch; + size_t buf_size = sizeof(scratch); + int wrote; + int cb_ret; + + do { + va_list args; + va_start(args, fmt); + + wrote = vsnprintf(buf, buf_size, fmt, args); + if(wrote < (ssize_t)buf_size) { + if(wrote < 0) { + if(buf != scratch) FREEMEM(buf); + va_end(args); + return -1; + } + break; + } + + buf_size <<= 1; + if(buf == scratch) { + buf = MALLOC(buf_size); + if(!buf) return -1; + } else { + void *p = REALLOC(buf, buf_size); + if(!p) { + FREEMEM(buf); + return -1; + } + buf = p; + } + } while(1); + + cb_ret = cb(buf, wrote, key); + if(buf != scratch) FREEMEM(buf); + if(cb_ret < 0) { + return -1; + } + + return wrote; +} + diff --git a/src/codec_utils/E2SMKPM/asn_internal.h b/src/codec_utils/E2SMKPM/asn_internal.h new file mode 100644 index 000000000..c4105ad51 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_internal.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Declarations internally useful for the ASN.1 support code. + */ +#ifndef ASN_INTERNAL_H +#define ASN_INTERNAL_H +#define __EXTENSIONS__ /* for Sun */ + +#include "asn_application.h" /* Application-visible API */ + +#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ +#include /* for assert() macro */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Environment version might be used to avoid running with the old library */ +#define ASN1C_ENVIRONMENT_VERSION 923 /* Compile-time version */ +int get_asn1c_environment_version(void); /* Run-time version */ + +#define CALLOC(nmemb, size) calloc(nmemb, size) +#define MALLOC(size) malloc(size) +#define REALLOC(oldptr, size) realloc(oldptr, size) +#define FREEMEM(ptr) free(ptr) + +#define asn_debug_indent 0 +#define ASN_DEBUG_INDENT_ADD(i) do{}while(0) + +#ifdef EMIT_ASN_DEBUG +#warning "Use ASN_EMIT_DEBUG instead of EMIT_ASN_DEBUG" +#define ASN_EMIT_DEBUG EMIT_ASN_DEBUG +#endif + +/* + * A macro for debugging the ASN.1 internals. + * You may enable or override it. + */ +#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ +#if ASN_EMIT_DEBUG == 1 /* And it was asked to emit this code... */ +#if !defined(BELL_LABS) /* Bell Labs */ + //#if __STDC_VERSION__ >= 199901L +#ifdef ASN_THREAD_SAFE +/* Thread safety requires sacrifice in output indentation: + * Retain empty definition of ASN_DEBUG_INDENT_ADD. */ +#else /* !ASN_THREAD_SAFE */ +#undef ASN_DEBUG_INDENT_ADD +#undef asn_debug_indent +int asn_debug_indent; +#define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0) +#endif /* ASN_THREAD_SAFE */ +#if defined(BELL_LABS) /* Bell Labs version */ +extern int logAsn1c(const char *filename, int linenumber, const char *format, ...); +#define ASN_DEBUG(fmt, args...) do { \ + (void) logAsn1c(__FILE__, __LINE__, fmt, ##args); \ + } while(0) +#else +#define ASN_DEBUG(fmt, args...) do { \ + int adi = asn_debug_indent; \ + while(adi--) fprintf(stderr, " "); \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) +#endif /* BELL_LABS */ +#else /* !C99 */ +void CC_PRINTFLIKE(1, 2) ASN_DEBUG_f(const char *fmt, ...); +#define ASN_DEBUG ASN_DEBUG_f +#endif /* C99 */ +#else /* ASN_EMIT_DEBUG != 1 */ +#if __STDC_VERSION__ >= 199901L +#define ASN_DEBUG(...) do{}while(0) +#else /* not C99 */ +static void CC_PRINTFLIKE(1, 2) ASN_DEBUG(const char *fmt, ...) { (void)fmt; } +#endif /* C99 or better */ +#endif /* ASN_EMIT_DEBUG */ +#endif /* ASN_DEBUG */ + +/* + * Print to a callback. + * The callback is expected to return negative values on error. + * 0 and positive values are treated as success. + * RETURN VALUES: + * -1: Failed to format or invoke the callback. + * >0: Size of the data that got delivered to the callback. + */ +ssize_t CC_PRINTFLIKE(3, 4) +asn__format_to_callback( + int (*callback)(const void *, size_t, void *key), void *key, + const char *fmt, ...); + +/* + * Invoke the application-supplied callback and fail, if something is wrong. + */ +#define ASN__E_cbc(buf, size) (cb((buf), (size), app_key) < 0) +#define ASN__E_CALLBACK(size, foo) \ + do { \ + if(foo) goto cb_failed; \ + er.encoded += (size); \ + } while(0) +#define ASN__CALLBACK(buf, size) ASN__E_CALLBACK(size, ASN__E_cbc(buf, size)) +#define ASN__CALLBACK2(buf1, size1, buf2, size2) \ + ASN__E_CALLBACK((size1) + (size2), \ + ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2)) +#define ASN__CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ + ASN__E_CALLBACK((size1) + (size2) + (size3), \ + ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2) \ + || ASN__E_cbc(buf3, size3)) + +#define ASN__TEXT_INDENT(nl, level) \ + do { \ + int tmp_level = (level); \ + int tmp_nl = ((nl) != 0); \ + int tmp_i; \ + if(tmp_nl) ASN__CALLBACK("\n", 1); \ + if(tmp_level < 0) tmp_level = 0; \ + for(tmp_i = 0; tmp_i < tmp_level; tmp_i++) ASN__CALLBACK(" ", 4); \ + } while(0) + +#define _i_INDENT(nl) do { \ + int tmp_i; \ + if((nl) && cb("\n", 1, app_key) < 0) \ + return -1; \ + for(tmp_i = 0; tmp_i < ilevel; tmp_i++) \ + if(cb(" ", 4, app_key) < 0) \ + return -1; \ + } while(0) + +/* + * Check stack against overflow, if limit is set. + */ +#define ASN__DEFAULT_STACK_MAX (30000) +static int CC_NOTUSED +ASN__STACK_OVERFLOW_CHECK(const asn_codec_ctx_t *ctx) { + if(ctx && ctx->max_stack_size) { + + /* ctx MUST be allocated on the stack */ + ptrdiff_t usedstack = ((const char *)ctx - (const char *)&ctx); + if(usedstack > 0) usedstack = -usedstack; /* grows up! */ + + /* double negative required to avoid int wrap-around */ + if(usedstack < -(ptrdiff_t)ctx->max_stack_size) { + ASN_DEBUG("Stack limit %ld reached", + (long)ctx->max_stack_size); + return -1; + } + } + return 0; +} + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_INTERNAL_H */ diff --git a/src/codec_utils/E2SMKPM/asn_ioc.h b/src/codec_utils/E2SMKPM/asn_ioc.h new file mode 100644 index 000000000..7de210ee0 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_ioc.h @@ -0,0 +1,51 @@ +/* + * Run-time support for Information Object Classes. + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_IOC_H +#define ASN_IOC_H + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; +struct asn_ioc_cell_s; + +/* + * X.681, #13 + */ +typedef struct asn_ioc_set_s { + size_t rows_count; + size_t columns_count; + const struct asn_ioc_cell_s *rows; +} asn_ioc_set_t; + + +typedef struct asn_ioc_cell_s { + const char *field_name; /* Is equal to corresponding column_name */ + enum { + aioc__undefined = 0, + aioc__value, + aioc__type, + aioc__open_type, + } cell_kind; + struct asn_TYPE_descriptor_s *type_descriptor; + const void *value_sptr; + struct { + size_t types_count; + struct { + unsigned choice_position; + } *types; + } open_type; +} asn_ioc_cell_t; + + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_IOC_H */ diff --git a/src/codec_utils/E2SMKPM/asn_random_fill.c b/src/codec_utils/E2SMKPM/asn_random_fill.c new file mode 100644 index 000000000..819cf700e --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_random_fill.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +int +asn_random_fill(const struct asn_TYPE_descriptor_s *td, void **struct_ptr, + size_t length) { + + if(td && td->op->random_fill) { + asn_random_fill_result_t res = + td->op->random_fill(td, struct_ptr, 0, length); + return (res.code == ARFILL_OK) ? 0 : -1; + } else { + return -1; + } +} + +static uintmax_t +asn__intmax_range(intmax_t lb, intmax_t ub) { + assert(lb <= ub); + if((ub < 0) == (lb < 0)) { + return ub - lb; + } else if(lb < 0) { + return 1 + ((uintmax_t)ub + (uintmax_t)-(lb + 1)); + } else { + assert(!"Unreachable"); + return 0; + } +} + +intmax_t +asn_random_between(intmax_t lb, intmax_t rb) { + if(lb == rb) { + return lb; + } else { + const uintmax_t intmax_max = ((~(uintmax_t)0) >> 1); + uintmax_t range = asn__intmax_range(lb, rb); + uintmax_t value = 0; + uintmax_t got_entropy = 0; + + assert(RAND_MAX > 0xffffff); /* Seen 7ffffffd! */ + assert(range < intmax_max); + + for(; got_entropy < range;) { + got_entropy = (got_entropy << 24) | 0xffffff; + value = (value << 24) | (random() % 0xffffff); + } + + return lb + (intmax_t)(value % (range + 1)); + } +} diff --git a/src/codec_utils/E2SMKPM/asn_random_fill.h b/src/codec_utils/E2SMKPM/asn_random_fill.h new file mode 100644 index 000000000..47f9b8af0 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_random_fill.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_RANDOM_FILL +#define ASN_RANDOM_FILL + +/* Forward declarations */ +struct asn_TYPE_descriptor_s; +struct asn_encoding_constraints_s; + +/* + * Initialize a structure with random data according to the type specification + * and optional member constraints. + * ARGUMENTS: + * (max_length) - See (approx_max_length_limit). + * (memb_constraints) - Member constraints, if exist. + * The type can be constrained differently according + * to PER and OER specifications, so we find a value + * at the intersection of these constraints. + * In case the return differs from ARFILL_OK, the (struct_ptr) contents + * and (current_length) value remain in their original state. + */ +typedef struct asn_random_fill_result_s { + enum { + ARFILL_FAILED = -1, /* System error (memory?) */ + ARFILL_OK = 0, /* Initialization succeeded */ + ARFILL_SKIPPED = 1 /* Not done due to (length?) constraint */ + } code; + size_t length; /* Approximate number of bytes created. */ +} asn_random_fill_result_t; +typedef asn_random_fill_result_t(asn_random_fill_f)( + const struct asn_TYPE_descriptor_s *td, void **struct_ptr, + const struct asn_encoding_constraints_s *memb_constraints, + size_t max_length); + +/* + * Returns 0 if the structure was properly initialized, -1 otherwise. + * The (approx_max_length_limit) specifies the approximate limit of the + * resulting structure in units closely resembling bytes. The actual result + * might be several times larger or smaller than the length limit. + */ +int asn_random_fill(const struct asn_TYPE_descriptor_s *td, void **struct_ptr, + size_t approx_max_length_limit); + +/* + * Returns a random number between min and max. + */ +intmax_t asn_random_between(intmax_t min, intmax_t max); + +#endif /* ASN_RANDOM_FILL */ diff --git a/src/codec_utils/E2SMKPM/asn_system.h b/src/codec_utils/E2SMKPM/asn_system.h new file mode 100644 index 000000000..fa8cf1165 --- /dev/null +++ b/src/codec_utils/E2SMKPM/asn_system.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Miscellaneous system-dependent types. + */ +#ifndef ASN_SYSTEM_H +#define ASN_SYSTEM_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE 1 +#endif + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE /* for snprintf() on some linux systems */ +#endif + +#include /* For snprintf(3) */ +#include /* For *alloc(3) */ +#include /* For memcpy(3) */ +#include /* For size_t */ +#include /* For LONG_MAX */ +#include /* For va_start */ +#include /* for offsetof and ptrdiff_t */ + +#ifdef _WIN32 + +#include +#define snprintf _snprintf +#define vsnprintf _vsnprintf + +/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ +#define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ + | (((l) << 8) & 0xff0000) \ + | (((l) >> 8) & 0xff00) \ + | ((l >> 24) & 0xff)) + +#ifdef _MSC_VER /* MSVS.Net */ +#ifndef __cplusplus +#define inline __inline +#endif +#ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ +#define ssize_t SSIZE_T +#if _MSC_VER < 1600 +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#else /* _MSC_VER >= 1600 */ +#include +#endif /* _MSC_VER < 1600 */ +#endif /* ASSUMESTDTYPES */ +#define WIN32_LEAN_AND_MEAN +#include +#include +#define isnan _isnan +#define finite _finite +#define copysign _copysign +#define ilogb _logb +#else /* !_MSC_VER */ +#include +#endif /* _MSC_VER */ + +#else /* !_WIN32 */ + +#if defined(__vxworks) +#include +#else /* !defined(__vxworks) */ + +#include /* C99 specifies this file */ +#include /* for ntohl() */ +#define sys_ntohl(foo) ntohl(foo) +#endif /* defined(__vxworks) */ + +#endif /* _WIN32 */ + +#if __GNUC__ >= 3 || defined(__clang__) +#define CC_ATTRIBUTE(attr) __attribute__((attr)) +#else +#define CC_ATTRIBUTE(attr) +#endif +#define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var)) +#define CC_NOTUSED CC_ATTRIBUTE(unused) +#ifndef CC_ATTR_NO_SANITIZE +#define CC_ATTR_NO_SANITIZE(what) CC_ATTRIBUTE(no_sanitize(what)) +#endif + +/* Figure out if thread safety is requested */ +#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) +#define ASN_THREAD_SAFE +#endif /* Thread safety */ + +#ifndef offsetof /* If not defined by */ +#define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) +#endif /* offsetof */ + +#ifndef MIN /* Suitable for comparing primitive types (integers) */ +#if defined(__GNUC__) +#define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ + ((_a)<(_b)?(_a):(_b)); }) +#else /* !__GNUC__ */ +#define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ +#endif /* __GNUC__ */ +#endif /* MIN */ + +#if __STDC_VERSION__ >= 199901L +#ifndef SIZE_MAX +#define SIZE_MAX ((~((size_t)0)) >> 1) +#endif + +#ifndef RSIZE_MAX /* C11, Annex K */ +#define RSIZE_MAX (SIZE_MAX >> 1) +#endif +#ifndef RSSIZE_MAX /* Halve signed size even further than unsigned */ +#define RSSIZE_MAX ((ssize_t)(RSIZE_MAX >> 1)) +#endif +#else /* Old compiler */ +#undef SIZE_MAX +#undef RSIZE_MAX +#undef RSSIZE_MAX +#define SIZE_MAX ((~((size_t)0)) >> 1) +#define RSIZE_MAX (SIZE_MAX >> 1) +#define RSSIZE_MAX ((ssize_t)(RSIZE_MAX >> 1)) +#endif + +#if __STDC_VERSION__ >= 199901L +#define ASN_PRI_SIZE "zu" +#define ASN_PRI_SSIZE "zd" +#define ASN_PRIuMAX PRIuMAX +#define ASN_PRIdMAX PRIdMAX +#else +#define ASN_PRI_SIZE "lu" +#define ASN_PRI_SSIZE "ld" +#if LLONG_MAX > LONG_MAX +#define ASN_PRIuMAX "llu" +#define ASN_PRIdMAX "lld" +#else +#define ASN_PRIuMAX "lu" +#define ASN_PRIdMAX "ld" +#endif +#endif + +#endif /* ASN_SYSTEM_H */ diff --git a/src/codec_utils/E2SMKPM/ber_decoder.c b/src/codec_utils/E2SMKPM/ber_decoder.c new file mode 100644 index 000000000..75d601695 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_decoder.c @@ -0,0 +1,283 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) +#undef RETURN +#define RETURN(_code) do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + if(opt_ctx) opt_ctx->step = step; /* Save context */ \ + if(_code == RC_OK || opt_ctx) \ + rval.consumed = consumed_myself; \ + else \ + rval.consumed = 0; /* Context-free */ \ + return rval; \ + } while(0) + +/* + * The BER decoder of any type. + */ +asn_dec_rval_t +ber_decode(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, + const void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->op->ber_decoder(opt_codec_ctx, type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + ptr, size, /* Buffer and its size */ + 0 /* Default tag mode is 0 */ + ); +} + +/* + * Check the set of >> tags matches the definition. + */ +asn_dec_rval_t +ber_check_tags(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, + const void *ptr, size_t size, int tag_mode, int last_tag_form, + ber_tlv_len_t *last_length, int *opt_tlv_form) { + ssize_t consumed_myself = 0; + ssize_t tag_len; + ssize_t len_len; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_len_t limit_len = -1; + int expect_00_terminators = 0; + int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ + int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ + int tagno; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + RETURN(RC_FAIL); + + /* + * So what does all this implicit skip stuff mean? + * Imagine two types, + * A ::= [5] IMPLICIT T + * B ::= [2] EXPLICIT T + * Where T is defined as + * T ::= [4] IMPLICIT SEQUENCE { ... } + * + * Let's say, we are starting to decode type A, given the + * following TLV stream: <5> <0>. What does this mean? + * It means that the type A contains type T which is, + * in turn, empty. + * Remember though, that we are still in A. We cannot + * just pass control to the type T decoder. Why? Because + * the type T decoder expects <4> <0>, not <5> <0>. + * So, we must make sure we are going to receive <5> while + * still in A, then pass control to the T decoder, indicating + * that the tag <4> was implicitly skipped. The decoder of T + * hence will be prepared to treat <4> as valid tag, and decode + * it appropriately. + */ + + tagno = step /* Continuing where left previously */ + + (tag_mode==1?-1:0) + ; + ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", + td->name, (long)size, tag_mode, step, tagno); + /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ + + if(tag_mode == 0 && tagno == (int)td->tags_count) { + /* + * This must be the _untagged_ ANY type, + * which outermost tag isn't known in advance. + * Fetch the tag and length separately. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + ASN_DEBUG("Advancing %ld in ANY case", + (long)(tag_len + len_len)); + ADVANCE(tag_len + len_len); + } else { + assert(tagno < (int)td->tags_count); /* At least one loop */ + } + for((void)tagno; tagno < (int)td->tags_count; tagno++, step++) { + + /* + * Fetch and process T from TLV. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + ASN_DEBUG("Fetching tag from {%p,%ld}: " + "len %ld, step %d, tagno %d got %s", + ptr, (long)size, + (long)tag_len, step, tagno, + ber_tlv_tag_string(tlv_tag)); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + + /* + * If {I}, don't check anything. + * If {I,B,C}, check B and C unless we're at I. + */ + if(tag_mode != 0 && step == 0) { + /* + * We don't expect tag to match here. + * It's just because we don't know how the tag + * is supposed to look like. + */ + } else { + assert(tagno >= 0); /* Guaranteed by the code above */ + if(tlv_tag != td->tags[tagno]) { + /* + * Unexpected tag. Too bad. + */ + ASN_DEBUG("Expected: %s, " + "expectation failed (tn=%d, tm=%d)", + ber_tlv_tag_string(td->tags[tagno]), + tagno, tag_mode + ); + RETURN(RC_FAIL); + } + } + + /* + * Attention: if there are more tags expected, + * ensure that the current tag is presented + * in constructed form (it contains other tags!). + * If this one is the last one, check that the tag form + * matches the one given in descriptor. + */ + if(tagno < ((int)td->tags_count - 1)) { + if(tlv_constr == 0) { + ASN_DEBUG("tlv_constr = %d, expfail", + tlv_constr); + RETURN(RC_FAIL); + } + } else { + if(last_tag_form != tlv_constr + && last_tag_form != -1) { + ASN_DEBUG("last_tag_form %d != %d", + last_tag_form, tlv_constr); + RETURN(RC_FAIL); + } + } + + /* + * Fetch and process L from TLV. + */ + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + ASN_DEBUG("Fetching len = %ld", (long)len_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + /* + * FIXME + * As of today, the chain of tags + * must either contain several indefinite length TLVs, + * or several definite length ones. + * No mixing is allowed. + */ + if(tlv_len == -1) { + /* + * Indefinite length. + */ + if(limit_len == -1) { + expect_00_terminators++; + } else { + ASN_DEBUG("Unexpected indefinite length " + "in a chain of definite lengths"); + RETURN(RC_FAIL); + } + ADVANCE(tag_len + len_len); + continue; + } else { + if(expect_00_terminators) { + ASN_DEBUG("Unexpected definite length " + "in a chain of indefinite lengths"); + RETURN(RC_FAIL); + } + } + + /* + * Check that multiple TLVs specify ever decreasing length, + * which is consistent. + */ + if(limit_len == -1) { + limit_len = tlv_len + tag_len + len_len; + if(limit_len < 0) { + /* Too great tlv_len value? */ + RETURN(RC_FAIL); + } + } else if(limit_len != tlv_len + tag_len + len_len) { + /* + * Inner TLV specifies length which is inconsistent + * with the outer TLV's length value. + */ + ASN_DEBUG("Outer TLV is %ld and inner is %ld", + (long)limit_len, (long)tlv_len); + RETURN(RC_FAIL); + } + + ADVANCE(tag_len + len_len); + + limit_len -= (tag_len + len_len); + if((ssize_t)size > limit_len) { + /* + * Make sure that we won't consume more bytes + * from the parent frame than the inferred limit. + */ + size = limit_len; + } + } + + if(opt_tlv_form) + *opt_tlv_form = tlv_constr; + if(expect_00_terminators) + *last_length = -expect_00_terminators; + else + *last_length = tlv_len; + + RETURN(RC_OK); +} diff --git a/src/codec_utils/E2SMKPM/ber_decoder.h b/src/codec_utils/E2SMKPM/ber_decoder.h new file mode 100644 index 000000000..1ac2a5ef0 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_decoder.h @@ -0,0 +1,66 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_DECODER_H_ +#define _BER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ + +/* + * The BER decoder of any type. + * This function may be invoked directly from the application. + * Decodes BER, DER and CER data (DER and CER are different subsets of BER). + * + * NOTE: Use the der_encode() function (der_encoder.h) to produce encoding + * which is compliant with ber_decode(). + */ +asn_dec_rval_t ber_decode( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ +); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef asn_dec_rval_t(ber_type_decoder_f)( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, + const void *buf_ptr, size_t size, int tag_mode); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Check that all tags correspond to the type definition (as given in head). + * On return, last_length would contain either a non-negative length of the + * value part of the last TLV, or the negative number of expected + * "end of content" sequences. The number may only be negative if the + * head->last_tag_form is non-zero. + */ +asn_dec_rval_t ber_check_tags( + const struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */ + const struct asn_TYPE_descriptor_s *type_descriptor, + asn_struct_ctx_t *opt_ctx, /* saved decoding context */ + const void *ptr, size_t size, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {-1,0:1}: any, primitive, constr */ + ber_tlv_len_t *last_length, int *opt_tlv_form /* optional tag form */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_DECODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/ber_tlv_length.c b/src/codec_utils/E2SMKPM/ber_tlv_length.c new file mode 100644 index 000000000..0a0deec1a --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_tlv_length.c @@ -0,0 +1,168 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r) { + const uint8_t *buf = (const uint8_t *)bufptr; + unsigned oct; + + if(size == 0) + return 0; /* Want more */ + + oct = *(const uint8_t *)buf; + if((oct & 0x80) == 0) { + /* + * Short definite length. + */ + *len_r = oct; /* & 0x7F */ + return 1; + } else { + ber_tlv_len_t len; + size_t skipped; + + if(_is_constructed && oct == 0x80) { + *len_r = -1; /* Indefinite length */ + return 1; + } + + if(oct == 0xff) { + /* Reserved in standard for future use. */ + return -1; + } + + oct &= 0x7F; /* Leave only the 7 LS bits */ + for(len = 0, buf++, skipped = 1; + oct && (++skipped <= size); buf++, oct--) { + + /* Verify that we won't overflow. */ + if(!(len >> ((8 * sizeof(len)) - (8+1)))) { + len = (len << 8) | *buf; + } else { + /* Too large length value. */ + return -1; + } + } + + if(oct == 0) { + if(len < 0 || len > RSSIZE_MAX) { + /* Length value out of sane range. */ + return -1; + } + + *len_r = len; + return skipped; + } + + return 0; /* Want more */ + } + +} + +ssize_t +ber_skip_length(const asn_codec_ctx_t *opt_codec_ctx, + int _is_constructed, const void *ptr, size_t size) { + ber_tlv_len_t vlen; /* Length of V in TLV */ + ssize_t tl; /* Length of L in TLV */ + ssize_t ll; /* Length of L in TLV */ + size_t skip; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + return -1; + + /* + * Determine the size of L in TLV. + */ + ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); + if(ll <= 0) return ll; + + /* + * Definite length. + */ + if(vlen >= 0) { + skip = ll + vlen; + if(skip > size) + return 0; /* Want more */ + return skip; + } + + /* + * Indefinite length! + */ + ASN_DEBUG("Skipping indefinite length"); + for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) { + ber_tlv_tag_t tag; + + /* Fetch the tag */ + tl = ber_fetch_tag(ptr, size, &tag); + if(tl <= 0) return tl; + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + ((const char *)ptr) + tl, size - tl); + if(ll <= 0) return ll; + + skip += tl + ll; + + /* + * This may be the end of the indefinite length structure, + * two consecutive 0 octets. + * Check if it is true. + */ + if(((const uint8_t *)ptr)[0] == 0 + && ((const uint8_t *)ptr)[1] == 0) + return skip; + + ptr = ((const char *)ptr) + tl + ll; + size -= tl + ll; + } + + /* UNREACHABLE */ +} + +size_t +der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { + size_t required_size; /* Size of len encoding */ + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + int i; + + if(len <= 127) { + /* Encoded in 1 octet */ + if(size) *buf = (uint8_t)len; + return 1; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 8; i < 8 * (int)sizeof(len); i += 8) { + if(len >> i) + required_size++; + else + break; + } + + if(size <= required_size) + return required_size + 1; + + *buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */ + + /* + * Produce the len encoding, space permitting. + */ + end = buf + required_size; + for(i -= 8; buf < end; i -= 8, buf++) + *buf = (uint8_t)(len >> i); + + return required_size + 1; +} + diff --git a/src/codec_utils/E2SMKPM/ber_tlv_length.h b/src/codec_utils/E2SMKPM/ber_tlv_length.h new file mode 100644 index 000000000..d1e4d48dd --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_tlv_length.h @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_LENGTH_H_ +#define _BER_TLV_LENGTH_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ssize_t ber_tlv_len_t; + +/* + * This function tries to fetch the length of the BER TLV value and place it + * in *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + * On return with >0, len_r is constrained as -1..MAX, where -1 mean + * that the value is of indefinite length. + */ +ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r); + +/* + * This function expects bufptr to be positioned over L in TLV. + * It returns number of bytes occupied by L and V together, suitable + * for skipping. The function properly handles indefinite length. + * RETURN VALUES: + * Standard {-1,0,>0} convention. + */ +ssize_t ber_skip_length( + const struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ + int _is_constructed, const void *bufptr, size_t size); + +/* + * This function serializes the length (L from TLV) in DER format. + * It always returns number of bytes necessary to represent the length, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_LENGTH_H_ */ diff --git a/src/codec_utils/E2SMKPM/ber_tlv_tag.c b/src/codec_utils/E2SMKPM/ber_tlv_tag.c new file mode 100644 index 000000000..4a7d732f8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_tlv_tag.c @@ -0,0 +1,144 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val &= 0x1F) != 0x1F) { + /* + * Simple form: everything encoded in a single octet. + * Tag Class is encoded using two least significant bits. + */ + *tag_r = (val << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; + skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + + +ssize_t +ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { + char buf[sizeof("[APPLICATION ]") + 32]; + ssize_t ret; + + ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + if(ret >= (ssize_t)sizeof(buf) || ret < 2) { + errno = EPERM; + return -1; + } + + return fwrite(buf, 1, ret, f); +} + +ssize_t +ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { + const char *type = 0; + int ret; + + switch(tag & 0x3) { + case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; + case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; + case ASN_TAG_CLASS_CONTEXT: type = ""; break; + case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; + } + + ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); + if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ + + return ret; +} + +char * +ber_tlv_tag_string(ber_tlv_tag_t tag) { + static char buf[sizeof("[APPLICATION ]") + 32]; + + (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + + return buf; +} + + +size_t +ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { + int tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + size_t required_size; + size_t i; + + if(tval <= 30) { + /* Encoded in 1 octet */ + if(size) buf[0] = (tclass << 6) | tval; + return 1; + } else if(size) { + *buf++ = (tclass << 6) | 0x1F; + size--; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { + if(tval >> i) + required_size++; + else + break; + } + + if(size < required_size) + return required_size + 1; + + /* + * Fill in the buffer, space permitting. + */ + end = buf + required_size - 1; + for(i -= 7; buf < end; i -= 7, buf++) + *buf = 0x80 | ((tval >> i) & 0x7F); + *buf = (tval & 0x7F); /* Last octet without high bit */ + + return required_size + 1; +} + diff --git a/src/codec_utils/E2SMKPM/ber_tlv_tag.h b/src/codec_utils/E2SMKPM/ber_tlv_tag.h new file mode 100644 index 000000000..ce227add6 --- /dev/null +++ b/src/codec_utils/E2SMKPM/ber_tlv_tag.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_TAG_H_ +#define _BER_TLV_TAG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum asn_tag_class { + ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ + ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ + ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ + ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ +}; +typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ + +/* + * Tag class is encoded together with tag value for optimization purposes. + */ +#define BER_TAG_CLASS(tag) ((tag) & 0x3) +#define BER_TAG_VALUE(tag) ((tag) >> 2) +#define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0) + +#define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) + +/* + * Several functions for printing the TAG in the canonical form + * (i.e. "[PRIVATE 0]"). + * Return values correspond to their libc counterparts (if any). + */ +ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); +ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); +char *ber_tlv_tag_string(ber_tlv_tag_t tag); + + +/* + * This function tries to fetch the tag from the input stream. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering tag. + * >0: Number of bytes used from bufptr. tag_r will contain the tag. + */ +ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); + +/* + * This function serializes the tag (T from TLV) in BER format. + * It always returns number of bytes necessary to represent the tag, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_TAG_H_ */ diff --git a/src/codec_utils/E2SMKPM/constr_CHOICE.c b/src/codec_utils/E2SMKPM/constr_CHOICE.c new file mode 100644 index 000000000..86dcbb030 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_CHOICE.c @@ -0,0 +1,1533 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static unsigned _fetch_present_idx(const void *struct_ptr, unsigned off, + unsigned size); +static void _set_present_idx(void *sptr, unsigned offset, unsigned size, + unsigned pres); +static const void *_get_member_ptr(const asn_TYPE_descriptor_t *, + const void *sptr, asn_TYPE_member_t **elm, + unsigned *present); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +asn_dec_rval_t +CHOICE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || td->tags_count) { + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, -1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn_TYPE_member_t *elm;/* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, LEFT, elm->tag_mode); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || td->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + td->name); + RETURN(RC_FAIL); + } + + /* UNREACHABLE */ + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +asn_enc_rval_t +CHOICE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval = {0,0,0}; + const void *memb_ptr; + size_t computed_size = 0; + unsigned present; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + ASN__ENCODE_FAILED; + } + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + if(elm->optional) { + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || td->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, + cb, app_key); + if(ret == -1) + ASN__ENCODE_FAILED; + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 && present <= td->elements_count) { + const asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); + } else { + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); + } + + return asn_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return (ber_tlv_tag_t)-1; + } +} + +int +CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + return 0; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + return elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: no CHOICE element given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +CHOICE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value of a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag. + * Phase 4: Skipping unknown extensions. + * Phase 5: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 4;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + unsigned old_present; + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Start/Continue decoding the inner member */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); + old_present = _fetch_present_idx(st, + specs->pres_offset, specs->pres_size); + assert(old_present == 0 || old_present == edx + 1); + /* Record what we've got */ + _set_present_idx(st, + specs->pres_offset, specs->pres_size, edx + 1); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 3; + /* Fall through */ + } + + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); + + /* Skip the extensions section */ + if(ctx->phase == 4) { + ASN_DEBUG("skip_unknown(%d, %ld)", + tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 5; + RETURN(RC_FAIL); + case 1: + ctx->phase = 3; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); + continue; + case 2: + ctx->phase = 3; + break; + } + } + + switch(tcv) { + case XCT_BOTH: + break; /* No CHOICE? */ + case XCT_CLOSING: + if(ctx->phase != 3) + break; + XER_ADVANCE(ch_size); + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which inner member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr,ch_size,elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx != td->elements_count) + continue; + + /* It is expected extension */ + if(specs->ext_start != -1) { + ASN_DEBUG("Got anticipated extension"); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + ctx->phase = 3; /* Terminating */ + } else { + ctx->left = 1; + ctx->phase = 4; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); + break; + } + + ctx->phase = 5; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + +asn_enc_rval_t +CHOICE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + unsigned present = 0; + + if(!sptr) + ASN__ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present == 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr = NULL; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_dec_rval_t +CHOICE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) { + ASN_DEBUG("CHOICE presence from wire %d", value); + value = specs->from_canonical_order[value]; + ASN_DEBUG("CHOICE presence index effective %d", value); + } + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + if(ct && ct->range_bits >= 0) { + if(present_enc < ct->lower_bound + || present_enc > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG( + "CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 0, 1)) + ASN__ENCODE_FAILED; + } + + + elm = &td->elements[present]; + ASN_DEBUG("CHOICE member \"%s\" %d (as %d)", elm->name, present, + present_enc); + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) ASN__ENCODE_FAILED; + if(uper_put_nsnnwn(po, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +asn_dec_rval_t +CHOICE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + const asn_per_constraint_t *ext_ct = NULL; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) { + ext_ct = ct; + ct = 0; /* Not restricted */ + } + } + + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = aper_get_nsnnwn(pd, ext_ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) + value = specs->from_canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct = NULL; + const asn_per_constraint_t *ext_ct = NULL; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE using ALIGNED PER", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = NULL; + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || (unsigned)present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + if(ct && (ct->range_bits >= 0)) { + // Value is not within the range of the primary values ? + if(present < ct->lower_bound || present > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + // X691/23.5 Extension marker = 1 + if(per_put_few_bits(po, 1, 1)) { + ASN__ENCODE_FAILED; + } + } else { + ASN__ENCODE_FAILED; + } + // no more need of constraint. + ext_ct = ct; + ct = NULL; + } + } + + if(ct && (ct->flags & APC_EXTENSIBLE)) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present, ct->lower_bound, ct->upper_bound); + // X691.23.5 Extension marker = 0 + if(per_put_few_bits(po, 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && (ct->range_bits >= 0)) { + // By construction (ct != 0), the alternative value is a non extended one. + // X691/23.7 X691/23.6 alternative value encoded as a range_bits bits value. + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) + ASN__ENCODE_FAILED; + // X691/23.8 normally encoded as a small non negative whole number + + if(ext_ct && aper_put_nsnnwn(po, ext_ct->range_bits, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +int +CHOICE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Print that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + } + + return elm->type->op->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static unsigned +_fetch_present_idx(const void *struct_ptr, unsigned pres_offset, + unsigned pres_size) { + const void *present_ptr; + unsigned present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const unsigned int *)present_ptr; break; + case sizeof(short): present = *(const unsigned short *)present_ptr; break; + case sizeof(char): present = *(const unsigned char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static void +_set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size, + unsigned present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(unsigned int *)present_ptr = present; break; + case sizeof(short): *(unsigned short *)present_ptr = present; break; + case sizeof(char): *(unsigned char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} + +static const void * +_get_member_ptr(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_TYPE_member_t **elm_ptr, unsigned *present_out) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + *elm_ptr = NULL; + *present_out = 0; + return NULL; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + *present_out = present; + + /* + * The presence index is intentionally 1-based to avoid + * treating zeroed structure as a valid one. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *const elm = &td->elements[present - 1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + *elm_ptr = elm; + return memb_ptr; + } else { + *elm_ptr = NULL; + return NULL; + } + +} + +int +CHOICE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + asn_TYPE_member_t *aelm; + asn_TYPE_member_t *belm; + unsigned apresent = 0; + unsigned bpresent = 0; + const void *amember = _get_member_ptr(td, aptr, &aelm, &apresent); + const void *bmember = _get_member_ptr(td, bptr, &belm, &bpresent); + + if(amember && bmember) { + if(apresent == bpresent) { + assert(aelm == belm); + return aelm->type->op->compare_struct(aelm->type, amember, bmember); + } else if(apresent < bpresent) { + return -1; + } else { + return 1; + } + } else if(!amember) { + return -1; + } else { + return 1; + } +} + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned +CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, const void *sptr) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + return _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); +} + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int +CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr, + unsigned present) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned old_present; + + if(!sptr) { + return -1; + } + + if(present > td->elements_count) + return -1; + + old_present = + _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + if(present == old_present) + return 0; + + if(old_present != 0) { + assert(old_present <= td->elements_count); + ASN_STRUCT_RESET(*td, sptr); + } + + _set_present_idx(sptr, specs->pres_offset, specs->pres_size, present); + + return 0; +} + + +asn_random_fill_result_t +CHOICE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_random_fill_result_t res; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm; + unsigned present; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *st = *sptr; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + present = asn_random_between(1, td->elements_count); + elm = &td->elements[present - 1]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + res = elm->type->op->random_fill(elm->type, memb_ptr2, + &elm->encoding_constraints, max_length); + _set_present_idx(st, specs->pres_offset, specs->pres_size, present); + if(res.code == ARFILL_OK) { + *sptr = st; + } else { + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + } + + return res; +} + + +asn_TYPE_operation_t asn_OP_CHOICE = { + CHOICE_free, + CHOICE_print, + CHOICE_compare, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + CHOICE_decode_oer, + CHOICE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + CHOICE_decode_uper, + CHOICE_encode_uper, + CHOICE_decode_aper, + CHOICE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + CHOICE_random_fill, + CHOICE_outmost_tag +}; diff --git a/src/codec_utils/E2SMKPM/constr_CHOICE.h b/src/codec_utils/E2SMKPM/constr_CHOICE.h new file mode 100644 index 000000000..a1999edc4 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_CHOICE.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_CHOICE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_codec_ctx_t member */ + unsigned pres_offset; /* Identifier of the present member */ + unsigned pres_size; /* Size of the identifier (enum) */ + + /* + * Tags to members mapping table. + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* Canonical ordering of CHOICE elements, for PER */ + const unsigned *to_canonical_order; + const unsigned *from_canonical_order; + + /* + * Extensions-related stuff. + */ + signed ext_start; /* First member of extensions, or -1 */ +} asn_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; +asn_struct_compare_f CHOICE_compare; +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; +xer_type_encoder_f CHOICE_encode_xer; +oer_type_decoder_f CHOICE_decode_oer; +oer_type_encoder_f CHOICE_encode_oer; +per_type_decoder_f CHOICE_decode_uper; +per_type_encoder_f CHOICE_encode_uper; +per_type_decoder_f CHOICE_decode_aper; +per_type_encoder_f CHOICE_encode_aper; +asn_outmost_tag_f CHOICE_outmost_tag; +asn_random_fill_f CHOICE_random_fill; +extern asn_TYPE_operation_t asn_OP_CHOICE; + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, + const void *structure_ptr); + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, + void *structure_ptr, unsigned present); + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/src/codec_utils/E2SMKPM/constr_CHOICE_oer.c b/src/codec_utils/E2SMKPM/constr_CHOICE_oer.c new file mode 100644 index 000000000..a4c591c8e --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_CHOICE_oer.c @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val & 0x3F) != 0x3F) { + /* #8.7.1 */ + *tag_r = ((val & 0x3F) << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + +asn_dec_rval_t +CHOICE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + (void)constraints; + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + switch(ctx->phase) { + case 0: { + /* + * Discover the tag. + */ + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + + tag_len = oer_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case 0: + ASN__DECODE_STARVED; + case -1: + ASN__DECODE_FAILED; + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + + t2m = (const asn_TYPE_tag2member_t *)bsearch( + &key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG( + "Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip open type extension */ + ASN_DEBUG( + "Not implemented skipping open type extension for tag %s", + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + } while(0); + + + ADVANCE(tag_len); + } + /* Fall through */ + case 1: { + asn_TYPE_member_t *elm = &elements[ctx->step]; /* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_dec_rval_t rval = {0,0}; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Set presence to be able to free it properly at any time */ + (void)CHOICE_variant_set_presence(td, st, ctx->step + 1); + + if(specs->ext_start >= 0 && specs->ext_start <= ctx->step) { + ssize_t got = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + if(got < 0) ASN__DECODE_FAILED; + if(got == 0) ASN__DECODE_STARVED; + rval.code = RC_OK; + rval.consumed = got; + } else { + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + rval.consumed += consumed_myself; + switch(rval.code) { + case RC_OK: + NEXT_PHASE(ctx); + case RC_WMORE: + break; + case RC_FAIL: + SET_PHASE(ctx, 3); /* => 3 */ + } + return rval; + } + case 2: + /* Already decoded everything */ + RETURN(RC_OK); + case 3: + /* Failed to decode, after all */ + RETURN(RC_FAIL); + } + + RETURN(RC_FAIL); +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_put_tag(ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + + if(tval < 0x3F) { + uint8_t b = (uint8_t)((tclass << 6) | tval); + if(cb(&b, 1, app_key) < 0) { + return -1; + } + return 1; + } else { + uint8_t buf[1 + 2 * sizeof(tval)]; + uint8_t *b = &buf[sizeof(buf)-1]; /* Last addressable */ + size_t encoded; + for(; ; tval >>= 7) { + if(tval >> 7) { + *b-- = 0x80 | (tval & 0x7f); + } else { + *b-- = tval & 0x7f; + break; + } + } + *b = (uint8_t)((tclass << 6) | 0x3F); + encoded = sizeof(buf) - (b - buf); + if(cb(b, encoded, app_key) < 0) { + return -1; + } + return encoded; + } + +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +CHOICE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + unsigned present; + const void *memb_ptr; + ber_tlv_tag_t tag; + ssize_t tag_len; + asn_enc_rval_t er = {0, 0, 0}; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("OER %s encoding as CHOICE", td->name); + + present = CHOICE_variant_get_presence(td, sptr); + if(present == 0 || present > td->elements_count) { + ASN_DEBUG("CHOICE %s member is not selected", td->name); + ASN__ENCODE_FAILED; + } + + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + tag = asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); + if(tag == 0) { + ASN__ENCODE_FAILED; + } + + tag_len = oer_put_tag(tag, cb, app_key); + if(tag_len < 0) { + ASN__ENCODE_FAILED; + } + + if(specs->ext_start >= 0 && (unsigned)specs->ext_start <= (present-1)) { + ssize_t encoded = oer_open_type_put(elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(encoded < 0) ASN__ENCODE_FAILED; + er.encoded = tag_len + encoded; + } else { + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded >= 0) er.encoded += tag_len; + } + + return er; +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/constr_SEQUENCE.c b/src/codec_utils/E2SMKPM/constr_SEQUENCE.c new file mode 100644 index 000000000..43dcac70b --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SEQUENCE.c @@ -0,0 +1,2059 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) { + if(a->el_no > b->el_no) + return 1; + /* + * Important: we do not check + * for a->el_no <= b->el_no! + */ + return 0; + } else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = ((size_t)ctx->step >> 1); edx < td->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + size_t opt_edx_end; /* Next non-optional element */ + size_t n; + int use_bsearch; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%" ASN_PRI_SIZE " flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx))) { + ASN_DEBUG("End of SEQUENCE %s", td->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("Current tag in %s SEQUENCE for element %" ASN_PRI_SIZE " " + "(%s) is %s encoded in %d bytes, of frame %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } else if(((const uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %" ASN_PRI_SIZE ", opt = %d, ec=%d", edx, + elements[edx].optional, td->elements_count); + if((edx + elements[edx].optional == td->elements_count) + || IN_EXTENSION_GROUP(specs, edx)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + + /* + * Find the next available type with this tag. + */ + use_bsearch = 0; + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ + else if(opt_edx_end - edx > 8) { + /* Limit the scope of linear search... */ + opt_edx_end = edx + 8; + use_bsearch = 1; + /* ... and resort to bsearch() */ + } + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].flags & ATF_ANY_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; + break; + } + } + if(use_bsearch) { + /* + * Resort to a binary search over + * sorted array of tags. + */ + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + key.el_no = edx; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + const asn_TYPE_tag2member_t *best = 0; + const asn_TYPE_tag2member_t *t2m_f, *t2m_l; + size_t edx_max = edx + elements[edx].optional; + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + } + n = opt_edx_end; + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + if(!IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Unexpected tag %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + ASN_DEBUG("Expected tag %s (%s)%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + edx += elements[edx].optional; + + ASN_DEBUG("Skipping unexpected %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, td->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + if(elements[edx].flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_ber_get(opt_codec_ctx, td, st, &elements[edx], ptr, LEFT); + } else { + rval = elements[edx].type->op->ber_decoder(opt_codec_ctx, + elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + } + ASN_DEBUG("In %s SEQUENCE decoded %" ASN_PRI_SIZE " %s of %d " + "in %d bytes rval.code %d, size=%d", + td->name, edx, elements[edx].type->name, + (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + /* Fall through */ + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + td->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, td->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + td->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + + +/* + * The DER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t computed_size = 0; + asn_enc_rval_t erval = {0,0,0}; + ssize_t ret; + size_t edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + erval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) + ASN__ENCODE_FAILED; + erval.encoded = computed_size + ret; + + if(!cb) ASN__ENCODED_OK(erval); + + /* + * Encode all members. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval = {0,0,0}; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + tmperval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s of SEQUENCE %s encoded in %ld bytes", + edx, elm->name, td->name, (long)tmperval.encoded); + } + + if(computed_size != 0) + /* + * Encoded size is not equal to the computed size. + */ + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(erval); +} + + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) \ + do { \ + size_t num = (num_bytes); \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SEQUENCE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Skipping unknown extensions. + * Phase 4: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 3;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the inner member of a sequence. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr_dontuse; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr_dontuse = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr_dontuse; /* Only use of memb_ptr_dontuse */ + } + + if(elm->flags & ATF_OPEN_TYPE) { + tmprval = OPEN_TYPE_xer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + /* Invoke the inner type decoder, m.b. multiple times */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + ptr, size); + } + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; /* Back to body processing */ + ctx->step = ++edx; + ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", + ctx->phase, ctx->step); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", + tcv, ctx->phase, xml_tag); + + /* Skip the extensions section */ + if(ctx->phase == 3) { + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 4; + RETURN(RC_FAIL); + case 0: + XER_ADVANCE(ch_size); + continue; + case 1: + XER_ADVANCE(ch_size); + ctx->phase = 1; + continue; + case 2: + ctx->phase = 1; + break; + } + } + + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx)) { + XER_ADVANCE(ch_size); + ctx->phase = 4; /* Phase out */ + RETURN(RC_OK); + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%" ASN_PRI_SIZE "", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { + break; /* Really unexpected */ + } + + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + size_t n; + size_t edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(ptr, ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %" ASN_PRI_SIZE "/%u", + edx, td->elements_count); + } + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %" ASN_PRI_SIZE "", + edx); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + } else { + ctx->left = 1; + ctx->phase = 3; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", + size>0?((const char *)ptr)[0]:'.', + size>1?((const char *)ptr)[1]:'.', + size>2?((const char *)ptr)[2]:'.', + size>3?((const char *)ptr)[3]:'.', + size>4?((const char *)ptr)[4]:'.', + size>5?((const char *)ptr)[5]:'.'); + break; + } + + ctx->phase = 4; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + +asn_enc_rval_t +SEQUENCE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + int xcan = (flags & XER_F_CANONICAL); + asn_TYPE_descriptor_t *tmp_def_val_td = 0; + void *tmp_def_val = 0; + size_t edx; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + assert(tmp_def_val == 0); + if(elm->default_value_set) { + if(elm->default_value_set(&tmp_def_val)) { + ASN__ENCODE_FAILED; + } else { + memb_ptr = tmp_def_val; + tmp_def_val_td = elm->type; + } + } else if(elm->optional) { + continue; + } else { + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmp_def_val) { + ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + tmp_def_val = 0; + } + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + if(tmp_def_val) ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + ASN__ENCODE_FAILED; +} + +int +SEQUENCE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t edx; + int ret; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Print line */ + /* Fall through */ + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + _i_INDENT(1); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + + /* Print the member itself */ + ret = elm->type->op->print_struct(elm->type, memb_ptr, ilevel + 1, + cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, + enum asn_struct_free_method method) { + size_t edx; + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_struct_ctx_t *ctx; /* Decoder context */ + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + /* Clean parsing context */ + ctx = (asn_struct_ctx_t *)((char *)sptr + specs->ctx_offset); + FREEMEM(ctx->ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(sptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset( + sptr, 0, + ((const asn_SEQUENCE_specifics_t *)(td->specifics))->struct_size); + break; + } +} + +int +SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t edx; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + int ret = elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + if(ret) return ret; + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SEQUENCE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; + edx < (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_uper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = uper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, (long)bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, + *memb_ptr2); + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + ASN_DEBUG("Skipped overflow extension"); + continue; + } + break; + } + + FREEMEM(epres); + } + + if(specs->first_extension >= 0) { + unsigned i; + /* Fill DEFAULT members in extensions */ + for(i = specs->roms_count; i < specs->roms_count + specs->aoms_count; + i++) { + asn_TYPE_member_t *elm; + void **memb_ptr2; /* Pointer to member pointer */ + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE__handle_extensions(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s:%s (@%" ASN_PRI_SIZE ") present => %d", elm->name, + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) { + return -1; + } + /* Encode as open type field */ + if(po2 && present + && uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + *memb_ptr2, po2)) + return -1; + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE__handle_extensions(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(*memb_ptr2) == 0) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + ASN_DEBUG("Encoding %s->%s:%s", td->name, elm->name, elm->type->name); + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, *memb_ptr2, + po); + if(er.encoded == -1) return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of extensions %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE__handle_extensions(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE__handle_extensions(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +SEQUENCE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (APER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ +#if 0 + int padding; +#endif + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } +#if 0 + /* Get Padding */ + padding = (8 - (pd->moved % 8)) % 8; + if(padding > 0) + ASN_DEBUG("For element %s,offset= %ld Padding bits = %d", td->name, pd->moved, padding); +#if 0 /* old way of removing padding */ + per_get_few_bits(pd, padding); +#else /* Experimental fix proposed by @mhanna123 */ + if(edx != (td->elements_count-1)) + per_get_few_bits(pd, padding); + else { + if(specs->roms_count && (padding > 0)) + ASN_DEBUG(">>>>> not skipping padding of %d bits for element:%ld out of %d", padding, edx, td->elements_count); + else + per_get_few_bits(pd, padding); + } +#endif /* dealing with padding */ +#endif + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_aper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = aper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) + ASN__DECODE_STARVED; + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%ld is not extension", edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: + break; + case 0: + continue; + default: + if(aper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + } + break; + } + + FREEMEM(epres); + } + + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE_handle_extensions_aper(const asn_TYPE_descriptor_t *td, + const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%s (@%ld) is not extension", elm->type->name, edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s (@%ld) present => %d", + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && aper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (APER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE_handle_extensions_aper(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr2) == 1) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %ld not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(memb_ptr2) == 1) + continue; + + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); + er = elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + *memb_ptr2, po); + if(er.encoded == -1) + return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(aper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions_aper(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions_aper(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + size_t edx; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *amemb; + const void *bmemb; + int ret; + + if(elm->flags & ATF_POINTER) { + amemb = + *(const void *const *)((const char *)aptr + elm->memb_offset); + bmemb = + *(const void *const *)((const char *)bptr + elm->memb_offset); + if(!amemb) { + if(!bmemb) continue; + if(elm->default_value_cmp + && elm->default_value_cmp(bmemb) == 0) { + /* A is absent, but B is present and equal to DEFAULT */ + continue; + } + return -1; + } else if(!bmemb) { + if(elm->default_value_cmp + && elm->default_value_cmp(amemb) == 0) { + /* B is absent, but A is present and equal to DEFAULT */ + continue; + } + return 1; + } + } else { + amemb = (const void *)((const char *)aptr + elm->memb_offset); + bmemb = (const void *)((const char *)bptr + elm->memb_offset); + } + + ret = elm->type->op->compare_struct(elm->type, amemb, bmemb); + if(ret != 0) return ret; + } + + return 0; +} + +asn_TYPE_operation_t asn_OP_SEQUENCE = { + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_compare, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_decode_oer, + SEQUENCE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + SEQUENCE_decode_aper, + SEQUENCE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SEQUENCE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + void *st = *sptr; + size_t edx; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + for(edx = 0; edx < td->elements_count; edx++) { + const asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_random_fill_result_t tmpres; + + if(elm->optional && asn_random_between(0, 4) == 2) { + /* Sometimes decide not to fill the optional value */ + continue; + } + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + tmpres = elm->type->op->random_fill( + elm->type, memb_ptr2, &elm->encoding_constraints, + max_length > result_ok.length ? max_length - result_ok.length : 0); + switch(tmpres.code) { + case ARFILL_OK: + result_ok.length += tmpres.length; + continue; + case ARFILL_SKIPPED: + assert(!(elm->flags & ATF_POINTER) || *memb_ptr2 == NULL); + continue; + case ARFILL_FAILED: + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + return tmpres; + } + } + + *sptr = st; + + return result_ok; +} + diff --git a/src/codec_utils/E2SMKPM/constr_SEQUENCE.h b/src/codec_utils/E2SMKPM/constr_SEQUENCE.h new file mode 100644 index 000000000..a22ed3a27 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SEQUENCE.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* + * Tags to members mapping table (sorted). + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + const int *oms; /* Optional MemberS */ + unsigned roms_count; /* Root optional members count */ + unsigned aoms_count; /* Additions optional members count */ + + /* + * Description of an extensions group. + * Root components are clustered at the beginning of the structure, + * whereas extensions are clustered at the end. -1 means not extensible. + */ + signed first_extension; /* First extension addition */ +} asn_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; +asn_struct_compare_f SEQUENCE_compare; +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; +xer_type_encoder_f SEQUENCE_encode_xer; +oer_type_decoder_f SEQUENCE_decode_oer; +oer_type_encoder_f SEQUENCE_encode_oer; +per_type_decoder_f SEQUENCE_decode_uper; +per_type_encoder_f SEQUENCE_encode_uper; +per_type_decoder_f SEQUENCE_decode_aper; +per_type_encoder_f SEQUENCE_encode_aper; +asn_random_fill_f SEQUENCE_random_fill; +extern asn_TYPE_operation_t asn_OP_SEQUENCE; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.c b/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.c new file mode 100644 index 000000000..10f18cf46 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.c @@ -0,0 +1,358 @@ +/*- + * Copyright (c) 2003, 2004, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The DER encoder of the SEQUENCE OF type. + */ +asn_enc_rval_t +SEQUENCE_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(ptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + asn_enc_rval_t erval = {0,0,0}; + int edx; + + ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + computed_size += encoding_size; + if(!cb) { + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + cb, app_key); + if(erval.encoded == -1) + return erval; + encoding_size += erval.encoded; + } + + if(computed_size != (size_t)encoding_size) { + /* + * Encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + erval.structure_ptr = 0; + erval.failed_type = 0; + } + + return erval; +} + +asn_enc_rval_t +SEQUENCE_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 + : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + if(!xcan) ASN__TEXT_INDENT(1, ilevel + 1); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_enc_rval_t +SEQUENCE_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + const asn_TYPE_member_t *elm = td->elements; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, + po); + if(er.encoded == -1) ASN__ENCODE_FAILED; + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + ASN__ENCODED_OK(er); +} + +asn_enc_rval_t +SEQUENCE_OF_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + asn_TYPE_member_t *elm = td->elements; + int seq; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF size (%d) using ALIGNED PER", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = (list->count < ct->lower_bound + || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", + ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) + ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) + ASN__ENCODE_FAILED; + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ +/* if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; +*/ + if (aper_put_length(po, ct->upper_bound - ct->lower_bound + 1, list->count - ct->lower_bound) < 0) + ASN__ENCODE_FAILED; + } + + for(seq = -1; seq < list->count;) { + ssize_t mayEncode; + if(seq < 0) seq = 0; + if(ct && ct->effective_bits >= 0) { + mayEncode = list->count; + } else { + mayEncode = aper_put_length(po, -1, list->count - seq); + if(mayEncode < 0) ASN__ENCODE_FAILED; + } + + while(mayEncode--) { + void *memb_ptr = list->array[seq++]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->aper_encoder(elm->type, + elm->encoding_constraints.per_constraints, memb_ptr, po); + if(er.encoded == -1) + ASN__ENCODE_FAILED; + } + } + + ASN__ENCODED_OK(er); +} +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_sequence_ *a = _A_CSEQUENCE_FROM_VOID(aptr); + const asn_anonymous_sequence_ *b = _A_CSEQUENCE_FROM_VOID(bptr); + ssize_t idx; + + if(a && b) { + ssize_t common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, a->array[idx], b->array[idx]); + if(ret) return ret; + } + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_compare, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ + SEQUENCE_OF_encode_oer, /* Same as SET OF encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_OF_decode_uper, /* Same as SET OF decoder */ + SEQUENCE_OF_encode_uper, + SEQUENCE_OF_decode_aper, + SEQUENCE_OF_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + diff --git a/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.h b/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.h new file mode 100644 index 000000000..6857f0f0c --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SEQUENCE_OF.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_OF_H_ +#define _CONSTR_SEQUENCE_OF_H_ + +#include +#include /* Implemented using SET OF */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * A set specialized functions dealing with the SEQUENCE OF type. + * Generally implemented using SET OF. + */ +asn_struct_compare_f SEQUENCE_OF_compare; +der_type_encoder_f SEQUENCE_OF_encode_der; +xer_type_encoder_f SEQUENCE_OF_encode_xer; +per_type_encoder_f SEQUENCE_OF_encode_uper; +per_type_encoder_f SEQUENCE_OF_encode_aper; +extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; + +#define SEQUENCE_OF_free SET_OF_free +#define SEQUENCE_OF_print SET_OF_print +#define SEQUENCE_OF_constraint SET_OF_constraint +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber +#define SEQUENCE_OF_decode_xer SET_OF_decode_xer +#define SEQUENCE_OF_decode_oer SET_OF_decode_oer +#define SEQUENCE_OF_encode_oer SET_OF_encode_oer +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper +#define SEQUENCE_OF_decode_aper SET_OF_decode_aper +#define SEQUENCE_OF_random_fill SET_OF_random_fill + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/src/codec_utils/E2SMKPM/constr_SEQUENCE_oer.c b/src/codec_utils/E2SMKPM/constr_SEQUENCE_oer.c new file mode 100644 index 000000000..ecb589cc3 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SEQUENCE_oer.c @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +#define IN_ROOT_GROUP_PRED(edx) \ + edx < (specs->first_extension < 0 ? td->elements_count \ + : (size_t)specs->first_extension) + +#define FOR_IN_ROOT_GROUP(edx) for(edx = 0; IN_ROOT_GROUP_PRED(edx); edx++) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Return pointer to a member. + */ +static void ** +element_ptrptr(void *struct_ptr, asn_TYPE_member_t *elm, void **tmp_save_ptr) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return (void **)((char *)struct_ptr + elm->memb_offset); + } else { + assert(tmp_save_ptr); + *tmp_save_ptr = (void *)((char *)struct_ptr + elm->memb_offset); + return tmp_save_ptr; + } +} + +static const void * +element_ptr(const void *struct_ptr, const asn_TYPE_member_t *elm) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return *(const void *const *)((const char *)struct_ptr + + elm->memb_offset); + } else { + return (const void *)((const char *)struct_ptr + elm->memb_offset); + } +} + +asn_dec_rval_t +SEQUENCE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch preamble. + */ + asn_bit_data_t *preamble; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + size_t preamble_bytes = ((7 + preamble_bits) >> 3); + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 0", td->name); + + ASN_DEBUG( + "Expecting preamble bits %" ASN_PRI_SIZE " for %s (including %d extension bits)", + preamble_bits, td->name, has_extensions_bit); + + if(preamble_bytes > size) { + ASN__DECODE_STARVED; + } + + preamble = asn_bit_data_new_contiguous(ptr, preamble_bits); + if(!preamble) { + RETURN(RC_FAIL); + } + preamble->nboff = has_extensions_bit; + ctx->ptr = preamble; + ADVANCE(preamble_bytes); + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_bit_data_t *preamble = ctx->ptr; + size_t edx; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 1 (Root)", td->name); + + assert(preamble); + + for(edx = (ctx->step >> 1); IN_ROOT_GROUP_PRED(edx); + edx++, ctx->step = (ctx->step & ~1) + 2) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + ASN_DEBUG("Decoding %s->%s", td->name, elm->name); + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + if(ctx->step & 1) { + goto microphase2_decode_continues; + } + + + if(elm->optional) { + int32_t present = asn_get_few_bits(preamble, 1); + if(present < 0) { + ASN_DEBUG("Presence map ended prematurely: %d", present); + RETURN(RC_FAIL); + } else if(present == 0) { + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + void *tmp; + if(elm->default_value_set( + element_ptrptr(st, elm, &tmp))) { + RETURN(RC_FAIL); + } + } + /* The member is not present. */ + continue; + } + /* Present OPTIONAL or DEFAULT component. */ + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2_decode_continues: + if(elm->flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_oer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + void *save_memb_ptr; /* Temporary reference. */ + void **memb_ptr2; /* Pointer to a pointer to a memmber */ + + memb_ptr2 = element_ptrptr(st, elm, &save_memb_ptr); + + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + switch(rval.code) { + case RC_OK: + ADVANCE(rval.consumed); + break; + case RC_WMORE: + ASN_DEBUG("More bytes needed at element %s \"%s\"", td->name, + elm->name); + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + case RC_FAIL: + ASN_DEBUG("Decoding failed at element %s \"%s\"", td->name, + elm->name); + RETURN(RC_FAIL); + } + } /* for(all root members) */ + + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 2: + assert(ctx->ptr); + { + /* Cleanup preamble. */ + asn_bit_data_t *preamble = ctx->ptr; + asn_bit_data_t *extadds; + int has_extensions_bit = (specs->first_extension >= 0); + int extensions_present = + has_extensions_bit + && (preamble->buffer == NULL + || (((const uint8_t *)preamble->buffer)[0] & 0x80)); + uint8_t unused_bits; + size_t len = 0; + ssize_t len_len; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 2", td->name); + + preamble->buffer = 0; /* Will do extensions_present==1 next time. */ + + if(!extensions_present) { + ctx->phase = 10; + RETURN(RC_OK); + } + + /* + * X.696 (08/2015) #16.1 (c), #16.4 + * Read in the extension addition presence bitmap. + */ + + len_len = oer_fetch_length(ptr, size, &len); + if(len_len > 0) { + ADVANCE(len_len); + } else if(len_len < 0) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + + if(len == 0) { + /* 16.4.1-2 */ + RETURN(RC_FAIL); + } else if(len > size) { + RETURN(RC_WMORE); + } + + /* Account for unused bits */ + unused_bits = 0x7 & *(const uint8_t *)ptr; + ADVANCE(1); + len--; + if(unused_bits && len == 0) { + RETURN(RC_FAIL); + } + + /* Get the extensions map */ + extadds = asn_bit_data_new_contiguous(ptr, len * 8 - unused_bits); + if(!extadds) { + RETURN(RC_FAIL); + } + FREEMEM(preamble); + ctx->ptr = extadds; + ADVANCE(len); + } + NEXT_PHASE(ctx); + ctx->step = + (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + /* Fall through */ + case 3: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 3 (Extensions)", td->name); + for(; ctx->step < (signed)td->elements_count; ctx->step++) { + asn_bit_data_t *extadds = ctx->ptr; + size_t edx = ctx->step; + asn_TYPE_member_t *elm = &td->elements[edx]; + void *tmp_memb_ptr; + void **memb_ptr2 = element_ptrptr(st, elm, &tmp_memb_ptr); + + switch(asn_get_few_bits(extadds, 1)) { + case -1: + /* + * Not every one of our extensions is known to the remote side. + * Continue filling in their defaults though. + */ + /* Fall through */ + case 0: + /* Fill-in DEFAULT */ + if(elm->default_value_set + && elm->default_value_set(memb_ptr2)) { + RETURN(RC_FAIL); + } + continue; + case 1: { + /* Read OER open type */ + ssize_t ot_size = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + assert(ot_size <= (ssize_t)size); + if(ot_size > 0) { + ADVANCE(ot_size); + } else if(ot_size < 0) { + RETURN(RC_FAIL); + } else { + /* Roll back open type parsing */ + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + break; + } + default: + RETURN(RC_FAIL); + } + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 4: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 4", td->name); + /* Read in the rest of Open Types while ignoring them */ + for(;;) { + asn_bit_data_t *extadds = ctx->ptr; + switch(asn_get_few_bits(extadds, 1)) { + case 0: + continue; + case 1: { + ssize_t skipped = oer_open_type_skip(ptr, size); + if(skipped > 0) { + ADVANCE(skipped); + } else if(skipped < 0) { + RETURN(RC_FAIL); + } else { + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + continue; + } + case -1: + /* No more Open Type encoded components */ + break; + default: + RETURN(RC_FAIL); + } + break; + } + } + + RETURN(RC_OK); +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + size_t computed_size = 0; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + uint32_t has_extensions = 0; + size_t edx; + int ret; + + (void)constraints; + + if(preamble_bits) { + asn_bit_outp_t preamble; + + memset(&preamble, 0, sizeof(preamble)); + preamble.output = cb; + preamble.op_key = app_key; + + if(has_extensions_bit) { + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default values in extensions */ + } else { + has_extensions = 1; + break; + } + } + } + ret = asn_put_few_bits(&preamble, has_extensions, 1); + assert(ret == 0); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + + /* + * Encode optional components bitmap. + */ + if(specs->roms_count) { + FOR_IN_ROOT_GROUP(edx) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + if(elm->optional) { + const void *memb_ptr = element_ptr(sptr, elm); + uint32_t has_component = memb_ptr != NULL; + if(has_component && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + has_component = 0; + } + ret = asn_put_few_bits(&preamble, has_component, 1); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + } + } + + asn_put_aligned_flush(&preamble); + computed_size += preamble.flushed_bytes; + } /* if(preamble_bits) */ + + /* + * Put root components and extensions root. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t er = {0,0,0}; + const void *memb_ptr; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Skip default values in encoding */ + continue; + } + } else { + if(elm->optional) continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + if(!elm->type->op->oer_encoder) { + ASN_DEBUG("OER encoder is not defined for type %s", elm->type->name); + ASN__ENCODE_FAILED; + } + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded == -1) { + ASN_DEBUG("... while encoding %s member \"%s\"\n", td->name, + elm->name); + return er; + } + computed_size += er.encoded; + } + + /* + * Before encode extensions, encode extensions additions presense bitmap + # X.696 (08/2015) #16.4. + */ + if(has_extensions) { + asn_bit_outp_t extadds; + + /* Special case allowing us to use exactly one byte for #8.6 */ + size_t aoms_length_bits = specs->aoms_count; + size_t aoms_length_bytes = (7 + aoms_length_bits) >> 3; + uint8_t unused_bits = 0x07 & (8 - (aoms_length_bits & 0x07)); + + assert(1 + aoms_length_bytes <= 127); + + memset(&extadds, 0, sizeof(extadds)); + extadds.output = cb; + extadds.op_key = app_key; + + /* #8.6 length determinant */ + ret = asn_put_few_bits(&extadds, (1 + aoms_length_bytes), 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Number of unused bytes, #16.4.2 */ + ret = asn_put_few_bits(&extadds, unused_bits, 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Encode presence bitmap #16.4.3 */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + memb_ptr = 0; /* Do not encode default value. */ + } + ret |= asn_put_few_bits(&extadds, memb_ptr ? 1 : 0, 1); + } + if(ret < 0) ASN__ENCODE_FAILED; + + asn_put_aligned_flush(&extadds); + computed_size += extadds.flushed_bytes; + + /* Now, encode extensions */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default value. */ + } else { + ssize_t wrote = oer_open_type_put( + elm->type, elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(wrote == -1) { + ASN__ENCODE_FAILED; + } + computed_size += wrote; + } + } else if(!elm->optional) { + ASN__ENCODE_FAILED; + } + } + } /* if(has_extensions) */ + + + { + asn_enc_rval_t er = {0, 0, 0}; + er.encoded = computed_size; + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/constr_SET_OF.c b/src/codec_utils/E2SMKPM/constr_SET_OF.c new file mode 100644 index 000000000..bf1dc2776 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SET_OF.c @@ -0,0 +1,1441 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", td->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(elm->tag != (ber_tlv_tag_t)-1) { + if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), td->name); + ASN_DEBUG("%s SET OF has tag %s", + td->name, ber_tlv_tag_string(elm->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, + elm->type, &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + td->name, elm->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((const char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((const char *)ptr)[0] == 0 + && ((const char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t allocated_size; + unsigned bits_unused; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; + + if(el_buf->length + size > el_buf->allocated_size) { + size_t new_size = el_buf->allocated_size ? el_buf->allocated_size : 8; + void *p; + + do { + new_size <<= 2; + } while(el_buf->length + size > new_size); + + p = REALLOC(el_buf->buf, new_size); + if(p) { + el_buf->buf = p; + el_buf->allocated_size = new_size; + } else { + return -1; + } + } + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} + +static void assert_unused_bits(const struct _el_buffer* p) { + if(p->length) { + assert((p->buf[p->length-1] & ~(0xff << p->bits_unused)) == 0); + } else { + assert(p->bits_unused == 0); + } +} + +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; + size_t common_len; + int ret = 0; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + if (a->buf && b->buf) { + ret = memcmp(a->buf, b->buf, common_len); + } + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + /* Ignore unused bits. */ + assert_unused_bits(a); + assert_unused_bits(b); + } + + return ret; +} + +static void +SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { + size_t i; + + for(i = 0; i < count; i++) { + FREEMEM(el_buf[i].buf); + } + + FREEMEM(el_buf); +} + +enum SET_OF__encode_method { + SOES_DER, /* Distinguished Encoding Rules */ + SOES_CUPER /* Canonical Unaligned Packed Encoding Rules */ +}; + +static struct _el_buffer * +SET_OF__encode_sorted(const asn_TYPE_member_t *elm, + const asn_anonymous_set_ *list, + enum SET_OF__encode_method method) { + struct _el_buffer *encoded_els; + int edx; + + encoded_els = + (struct _el_buffer *)CALLOC(list->count, sizeof(encoded_els[0])); + if(encoded_els == NULL) { + return NULL; + } + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + const void *memb_ptr = list->array[edx]; + struct _el_buffer *encoding_el = &encoded_els[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) break; + + /* + * Encode the member into the prepared space. + */ + switch(method) { + case SOES_DER: + erval = elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, + _el_addbytes, encoding_el); + break; + case SOES_CUPER: + erval = uper_encode(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, _el_addbytes, encoding_el); + if(erval.encoded != -1) { + size_t extra_bits = erval.encoded % 8; + assert(encoding_el->length == (size_t)(erval.encoded + 7) / 8); + encoding_el->bits_unused = (8 - extra_bits) & 0x7; + } + break; + default: + assert(!"Unreachable"); + break; + } + if(erval.encoded < 0) break; + } + + if(edx == list->count) { + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, list->count, sizeof(encoded_els[0]), _el_buf_cmp); + + return encoded_els; + } else { + SET_OF__encode_sorted_free(encoded_els, edx); + return NULL; + } +} + + +/* + * The DER encoder of the SET OF type. + */ +asn_enc_rval_t +SET_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) ASN__ENCODE_FAILED; + + erval = + elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) return erval; + computed_size += erval.encoded; + } + + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = + der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + if(encoding_size < 0) { + ASN__ENCODE_FAILED; + } + computed_size += encoding_size; + + if(!cb || list->count == 0) { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of %s SET OF", td->name); + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_DER); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + for(edx = 0; edx < list->count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(cb(encoded_el->buf, encoded_el->length, app_key) < 0) { + break; + } else { + encoding_size += encoded_el->length; + } + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if(edx == list->count) { + asn_enc_rval_t erval = {0,0,0}; + assert(computed_size == (size_t)encoding_size); + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } else { + ASN__ENCODE_FAILED; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SET_OF_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *element = td->elements; + const char *elm_tag; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval = {RC_OK, 0};/* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + for(; ctx->phase <= 2;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Go inside the inner member of a set. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval = {RC_OK, 0}; + + /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); + tmprval = element->type->op->xer_decoder(opt_codec_ctx, + element->type, &ctx->ptr, elm_tag, + buf_ptr, size); + if(tmprval.code == RC_OK) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + ctx->ptr = 0; + XER_ADVANCE(tmprval.consumed); + } else { + XER_ADVANCE(tmprval.consumed); + RETURN(tmprval.code); + } + ctx->phase = 1; /* Back to body processing */ + ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + /* No more things to decode */ + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + RETURN(RC_OK); + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); + if(ctx->phase == 1) { + /* + * Process a single possible member. + */ + ctx->phase = 2; + continue; + } + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SET OF"); + break; + } + + ctx->phase = 3; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + + + +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + +asn_enc_rval_t +SET_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + er.encoded = 0; + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + ASN__CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + ASN__ENCODE_FAILED; +cleanup: + if(encs) { + size_t n; + for(n = 0; n < encs_count; n++) { + FREEMEM(encs[n].buffer); + } + FREEMEM(encs); + } + ASN__ENCODED_OK(er); +} + +int +SET_OF_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int ret; + int i; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + _i_INDENT(1); + + ret = elm->type->op->print_struct(elm->type, memb_ptr, + ilevel + 1, cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SET_OF_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(td && ptr) { + const asn_SET_OF_specifics_t *specs; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ + + specs = (const asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } + } +} + +int +SET_OF_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + asn_constr_check_f *constr; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int i; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + constr = elm->encoding_constraints.general_constraints; + if(!constr) constr = elm->type->encoding_constraints.general_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + int ret; + + if(!memb_ptr) continue; + + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SET_OF_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, -1, 0, &repeat); + ASN_DEBUG("Got to decode %" ASN_PRI_SSIZE " elements (eff %d)", + nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) { + if(rv.consumed == 0 && nelems > 200) { + /* Protect from SET OF NULL compression bombs. */ + ASN__DECODE_FAILED; + } + continue; + } + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +asn_enc_rval_t +SET_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + const asn_TYPE_member_t *elm = td->elements; + struct _el_buffer *encoded_els; + asn_enc_rval_t er = {0,0,0}; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + + list = _A_CSET_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + + /* + * Canonical UPER #22.1 mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_CUPER); + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + const struct _el_buffer *el = &encoded_els[edx]; + if(asn_put_many_bits(po, el->buf, + (8 * el->length) - el->bits_unused) < 0) { + break; + } + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if((ssize_t)encoded_edx == list->count) { + ASN__ENCODED_OK(er); + } else { + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +SET_OF_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = aper_get_nsnnwn(pd, ct->upper_bound - ct->lower_bound + 1); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = aper_get_length(pd, ct ? ct->upper_bound - ct->lower_bound + 1 : -1, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + (int)nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +struct comparable_ptr { + const asn_TYPE_descriptor_t *td; + const void *sptr; +}; + +static int +SET_OF__compare_cb(const void *aptr, const void *bptr) { + const struct comparable_ptr *a = aptr; + const struct comparable_ptr *b = bptr; + assert(a->td == b->td); + return a->td->op->compare_struct(a->td, a->sptr, b->sptr); +} + +int +SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_set_ *a = _A_CSET_FROM_VOID(aptr); + const asn_anonymous_set_ *b = _A_CSET_FROM_VOID(bptr); + + if(a && b) { + struct comparable_ptr *asorted; + struct comparable_ptr *bsorted; + ssize_t common_length; + ssize_t idx; + + if(a->count == 0) { + if(b->count) return -1; + return 0; + } else if(b->count == 0) { + return 1; + } + + asorted = MALLOC(a->count * sizeof(asorted[0])); + bsorted = MALLOC(b->count * sizeof(bsorted[0])); + if(!asorted || !bsorted) { + FREEMEM(asorted); + FREEMEM(bsorted); + return -1; + } + + for(idx = 0; idx < a->count; idx++) { + asorted[idx].td = td->elements->type; + asorted[idx].sptr = a->array[idx]; + } + + for(idx = 0; idx < b->count; idx++) { + bsorted[idx].td = td->elements->type; + bsorted[idx].sptr = b->array[idx]; + } + + qsort(asorted, a->count, sizeof(asorted[0]), SET_OF__compare_cb); + qsort(bsorted, b->count, sizeof(bsorted[0]), SET_OF__compare_cb); + + common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, asorted[idx].sptr, bsorted[idx].sptr); + if(ret) { + FREEMEM(asorted); + FREEMEM(bsorted); + return ret; + } + } + + FREEMEM(asorted); + FREEMEM(bsorted); + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SET_OF = { + SET_OF_free, + SET_OF_print, + SET_OF_compare, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SET_OF_decode_oer, + SET_OF_encode_oer, +#endif +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SET_OF_decode_uper, + SET_OF_encode_uper, + SET_OF_decode_aper, + 0, /* SET_OF_encode_aper */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + SET_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SET_OF_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_SET_OF_specifics_t *specs = + (const asn_SET_OF_specifics_t *)td->specifics; + asn_random_fill_result_t res_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm = td->elements; + void *st = *sptr; + long max_elements = 5; + long slb = 0; /* Lower size bound */ + long sub = 0; /* Upper size bound */ + size_t rnd_len; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) { + return result_failed; + } + } + + switch(asn_random_between(0, 6)) { + case 0: max_elements = 0; break; + case 1: max_elements = 1; break; + case 2: max_elements = 5; break; + case 3: max_elements = max_length; break; + case 4: max_elements = max_length / 2; break; + case 5: max_elements = max_length / 4; break; + default: break; + } + sub = slb + max_elements; + + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->size; + if(pc->flags & APC_SEMI_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->lower_bound + max_elements; + } else if(pc->flags & APC_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->upper_bound; + if(sub - slb > max_elements) sub = slb + max_elements; + } + } + + /* Bias towards edges of allowed space */ + switch(asn_random_between(-1, 4)) { + default: + case -1: + /* Prepare lengths somewhat outside of constrained range. */ + if(constraints->per_constraints + && (constraints->per_constraints->size.flags & APC_EXTENSIBLE)) { + switch(asn_random_between(0, 5)) { + default: + case 0: + rnd_len = 0; + break; + case 1: + if(slb > 0) { + rnd_len = slb - 1; + } else { + rnd_len = 0; + } + break; + case 2: + rnd_len = asn_random_between(0, slb); + break; + case 3: + if(sub < (ssize_t)max_length) { + rnd_len = sub + 1; + } else { + rnd_len = max_length; + } + break; + case 4: + if(sub < (ssize_t)max_length) { + rnd_len = asn_random_between(sub + 1, max_length); + } else { + rnd_len = max_length; + } + break; + case 5: + rnd_len = max_length; + break; + } + break; + } + /* Fall through */ + case 0: + rnd_len = asn_random_between(slb, sub); + break; + case 1: + if(slb < sub) { + rnd_len = asn_random_between(slb + 1, sub); + break; + } + /* Fall through */ + case 2: + rnd_len = asn_random_between(slb, slb); + break; + case 3: + if(slb < sub) { + rnd_len = asn_random_between(slb, sub - 1); + break; + } + /* Fall through */ + case 4: + rnd_len = asn_random_between(sub, sub); + break; + } + + for(; rnd_len > 0; rnd_len--) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + void *ptr = 0; + asn_random_fill_result_t tmpres = elm->type->op->random_fill( + elm->type, &ptr, &elm->encoding_constraints, + (max_length > res_ok.length ? max_length - res_ok.length : 0) + / rnd_len); + switch(tmpres.code) { + case ARFILL_OK: + ASN_SET_ADD(list, ptr); + res_ok.length += tmpres.length; + break; + case ARFILL_SKIPPED: + break; + case ARFILL_FAILED: + assert(ptr == 0); + return tmpres; + } + } + + return res_ok; +} + diff --git a/src/codec_utils/E2SMKPM/constr_SET_OF.h b/src/codec_utils/E2SMKPM/constr_SET_OF.h new file mode 100644 index 000000000..768106271 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SET_OF.h @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef CONSTR_SET_OF_H +#define CONSTR_SET_OF_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SET_OF_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ +} asn_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; +asn_struct_compare_f SET_OF_compare; +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +xer_type_decoder_f SET_OF_decode_xer; +xer_type_encoder_f SET_OF_encode_xer; +oer_type_decoder_f SET_OF_decode_oer; +oer_type_encoder_f SET_OF_encode_oer; +per_type_decoder_f SET_OF_decode_uper; +per_type_encoder_f SET_OF_encode_uper; +per_type_decoder_f SET_OF_decode_aper; +per_type_encoder_f SET_OF_encode_aper; +asn_random_fill_f SET_OF_random_fill; +extern asn_TYPE_operation_t asn_OP_SET_OF; + +#ifdef __cplusplus +} +#endif + +#endif /* CONSTR_SET_OF_H */ diff --git a/src/codec_utils/E2SMKPM/constr_SET_OF_oer.c b/src/codec_utils/E2SMKPM/constr_SET_OF_oer.c new file mode 100644 index 000000000..520051811 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_SET_OF_oer.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +/* + * The SEQUENCE OF and SET OF values utilize a "quantity field". + * It is is a pointless combination of #8.6 (length determinant, capable + * of encoding tiny and huge numbers in the shortest possible number of octets) + * and the variable sized integer. What could have been encoded by #8.6 alone + * is required to be encoded by #8.6 followed by that number of unsigned octets. + * This doesn't make too much sense. It seems that the original version of OER + * standard have been using the unconstrained unsigned integer as a quantity + * field, and this legacy have gone through ISO/ITU-T standardization process. + */ +static ssize_t +oer_fetch_quantity(const void *ptr, size_t size, size_t *qty_r) { + const uint8_t *b; + const uint8_t *bend; + size_t len = 0; + size_t qty; + + ssize_t len_len = oer_fetch_length(ptr, size, &len); + if(len_len <= 0) { + *qty_r = 0; + return len_len; + } + + if((len_len + len) > size) { + *qty_r = 0; + return 0; + } + + b = (const uint8_t *)ptr + len_len; + bend = b + len; + + /* Skip the leading 0-bytes */ + for(; b < bend && *b == 0; b++) { + } + + if((bend - b) > (ssize_t)sizeof(size_t)) { + /* Length is not representable by the native size_t type */ + *qty_r = 0; + return -1; + } + + for(qty = 0; b < bend; b++) { + qty = (qty << 8) + *b; + } + + if(qty > RSIZE_MAX) { /* A bit of C11 validation */ + *qty_r = 0; + return -1; + } + + *qty_r = qty; + assert((size_t)len_len + len == (size_t)(bend - (const uint8_t *)ptr)); + return len_len + len; +} + +asn_dec_rval_t +SET_OF_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch number of elements to decode. + */ + size_t length = 0; + size_t len_size = oer_fetch_quantity(ptr, size, &length); + switch(len_size) { + case 0: + RETURN(RC_WMORE); + case -1: + RETURN(RC_FAIL); + default: + ADVANCE(len_size); + ctx->left = length; + } + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + const void *base_ptr = ptr; + ber_tlv_len_t base_ctx_left = ctx->left; + + assert(td->elements_count == 1); + + ASN_DEBUG("OER SET OF %s Decoding PHASE 1", td->name); + + for(; ctx->left > 0; ctx->left--) { + asn_dec_rval_t rv = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, &ctx->ptr, ptr, + size); + ADVANCE(rv.consumed); + switch(rv.code) { + case RC_OK: + if(ASN_SET_ADD(list, ctx->ptr) != 0) { + RETURN(RC_FAIL); + } else { + ctx->ptr = 0; + /* + * This check is to avoid compression bomb with + * specs like SEQUENCE/SET OF NULL which don't + * consume data at all. + */ + if(rv.consumed == 0 && base_ptr == ptr + && (base_ctx_left - ctx->left) > 200) { + ASN__DECODE_FAILED; + } + break; + } + case RC_WMORE: + RETURN(RC_WMORE); + case RC_FAIL: + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + SET_PHASE(ctx, 3); + RETURN(RC_FAIL); + } + } + /* Decoded decently. */ + NEXT_PHASE(ctx); + } + /* Fall through */ + case 2: + /* Ignore fully decoded */ + assert(ctx->left == 0); + RETURN(RC_OK); + case 3: + /* Failed to decode. */ + RETURN(RC_FAIL); + } + + return rval; +} + +static ssize_t +oer_put_quantity(size_t qty, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t buf[1 + sizeof(size_t)]; + uint8_t *b = &buf[sizeof(size_t)]; /* Last addressable */ + size_t encoded; + + do { + *b-- = qty; + qty >>= 8; + } while(qty); + + *b = sizeof(buf) - (b-buf) - 1; + encoded = sizeof(buf) - (b-buf); + if(cb(b, encoded, app_key) < 0) + return -1; + return encoded; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SET_OF_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_TYPE_member_t *elm; + const asn_anonymous_set_ *list; + size_t computed_size = 0; + ssize_t qty_len; + int n; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + elm = td->elements; + list = _A_CSET_FROM_VOID(sptr); + + qty_len = oer_put_quantity(list->count, cb, app_key); + if(qty_len < 0) { + ASN__ENCODE_FAILED; + } + computed_size += qty_len; + + for(n = 0; n < list->count; n++) { + void *memb_ptr = list->array[n]; + asn_enc_rval_t er = {0,0,0}; + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded < 0) { + return er; + } else { + computed_size += er.encoded; + } + } + + { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2SMKPM/constr_TYPE.c b/src/codec_utils/E2SMKPM/constr_TYPE.c new file mode 100644 index 000000000..aefaefdb7 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_TYPE.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn_TYPE_outmost_tag(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->op->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, + const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->op->print_struct(td, struct_ptr, 1, _print2fp, stream)) { + return -1; + } + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) { + return -1; + } + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} diff --git a/src/codec_utils/E2SMKPM/constr_TYPE.h b/src/codec_utils/E2SMKPM/constr_TYPE.h new file mode 100644 index 000000000..d80dea5a3 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constr_TYPE.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ + void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ +} asn_struct_ctx_t; + +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#include /* Subtype constraints support */ +#include /* Random structures support */ + +#ifdef ASN_DISABLE_OER_SUPPORT +typedef void (oer_type_decoder_f)(void); +typedef void (oer_type_encoder_f)(void); +typedef void asn_oer_constraints_t; +#else +#include /* Octet Encoding Rules encoder */ +#include /* Octet Encoding Rules encoder */ +#endif + +/* + * Free the structure according to its specification. + * Use one of ASN_STRUCT_{FREE,RESET,CONTENTS_ONLY} macros instead. + * Do not use directly. + */ +enum asn_struct_free_method { + ASFM_FREE_EVERYTHING, /* free(struct_ptr) and underlying members */ + ASFM_FREE_UNDERLYING, /* free underlying members */ + ASFM_FREE_UNDERLYING_AND_RESET /* FREE_UNDERLYING + memset(0) */ +}; +typedef void (asn_struct_free_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, enum asn_struct_free_method); + +/* + * Free the structure including freeing the memory pointed to by ptr itself. + */ +#define ASN_STRUCT_FREE(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_EVERYTHING) + +/* + * Free the memory used by the members of the structure without freeing the + * the structure pointer itself. + * ZERO-OUT the structure to the safe clean state. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + */ +#define ASN_STRUCT_RESET(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING_AND_RESET) + +/* + * Free memory used by the members of the structure without freeing + * the structure pointer itself. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + * AVOID using it in the application code; + * Use a safer ASN_STRUCT_RESET() instead. + */ +#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING) + +/* + * Print the structure according to its specification. + */ +typedef int(asn_struct_print_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Compare two structs between each other. + * Returns <0 if struct_A is "smaller" than struct_B, >0 if "greater", + * and =0 if "equal to", for some type-specific, stable definition of + * "smaller", "greater" and "equal to". + */ +typedef int (asn_struct_compare_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_A, + const void *struct_B); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type; used internally. */ +asn_outmost_tag_f asn_TYPE_outmost_tag; + +/* + * Fetch the desired type of the Open Type based on the + * Information Object Set driven constraints. + */ +typedef struct asn_type_selector_result_s { + const struct asn_TYPE_descriptor_s *type_descriptor; /* Type encoded. */ + unsigned presence_index; /* Associated choice variant. */ +} asn_type_selector_result_t; +typedef asn_type_selector_result_t(asn_type_selector_f)( + const struct asn_TYPE_descriptor_s *parent_type_descriptor, + const void *parent_structure_ptr); + +/* + * Generalized functions for dealing with the speciic type. + * May be directly invoked by applications. + */ +typedef struct asn_TYPE_operation_s { + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_struct_compare_f *compare_struct; /* Compare two structures */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + oer_type_decoder_f *oer_decoder; /* Generic OER decoder */ + oer_type_encoder_f *oer_encoder; /* Canonical OER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + per_type_decoder_f *aper_decoder; /* Aligned PER decoder */ + per_type_encoder_f *aper_encoder; /* Aligned PER encoder */ + asn_random_fill_f *random_fill; /* Initialize with a random value */ + asn_outmost_tag_f *outmost_tag; /* */ +} asn_TYPE_operation_t; + +/* + * A constraints tuple specifying both the OER and PER constraints. + */ +typedef struct asn_encoding_constraints_s { + const struct asn_oer_constraints_s *oer_constraints; + const struct asn_per_constraints_s *per_constraints; + asn_constr_check_f *general_constraints; +} asn_encoding_constraints_t; + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn_TYPE_descriptor_s { + const char *name; /* A name of the ASN.1 type. "" in some cases. */ + const char *xml_tag; /* Name used in XML tag */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_TYPE_operation_t *op; + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ + + /* + * Tags that are expected to occur. + */ + const ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ + unsigned tags_count; /* Number of tags which are expected */ + const ber_tlv_tag_t *all_tags; /* Every tag for BER/containment */ + unsigned all_tags_count; /* Number of tags */ + + /* OER, PER, and general constraints */ + asn_encoding_constraints_t encoding_constraints; + + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn_TYPE_member_s *elements; + unsigned elements_count; + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + const void *specifics; +} asn_TYPE_descriptor_t; + +/* + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. + */ + enum asn_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* Open Type */ + ATF_ANY_TYPE = 0x04 /* ANY type (deprecated!) */ + }; +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ + unsigned optional; /* Following optional members, including current */ + unsigned memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_type_selector_f *type_selector; /* IoS runtime type selector */ + asn_encoding_constraints_t encoding_constraints; + int (*default_value_cmp)(const void *sptr); /* Compare DEFAULT */ + int (*default_value_set)(void **sptr); /* Set DEFAULT */ + const char *name; /* ASN.1 identifier of the element */ +} asn_TYPE_member_t; + +/* + * BER tag to element number mapping. + */ +typedef struct asn_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + unsigned el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relative */ +} asn_TYPE_tag2member_t; + +/* + * This function prints out the contents of the target language's structure + * (struct_ptr) into the file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/src/codec_utils/E2SMKPM/constraints.c b/src/codec_utils/E2SMKPM/constraints.c new file mode 100644 index 000000000..df3c6c194 --- /dev/null +++ b/src/codec_utils/E2SMKPM/constraints.c @@ -0,0 +1,93 @@ +#include +#include + +int +asn_generic_no_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Unknown how to check */ + return 0; +} + +struct errbufDesc { + const asn_TYPE_descriptor_t *failed_type; + const void *failed_struct_ptr; + char *errbuf; + size_t errlen; +}; + +static void +_asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr, + const char *fmt, ...) { + struct errbufDesc *arg = key; + va_list ap; + ssize_t vlen; + ssize_t maxlen; + + arg->failed_type = td; + arg->failed_struct_ptr = sptr; + + maxlen = arg->errlen; + if(maxlen <= 0) + return; + + va_start(ap, fmt); + vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); + va_end(ap); + if(vlen >= maxlen) { + arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ + arg->errlen = maxlen - 1; /* Not counting termination */ + return; + } else if(vlen >= 0) { + arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ + arg->errlen = vlen; /* Not counting termination */ + } else { + /* + * The libc on this system is broken. + */ + vlen = sizeof("") - 1; + maxlen--; + arg->errlen = vlen < maxlen ? vlen : maxlen; + memcpy(arg->errbuf, "", arg->errlen); + arg->errbuf[arg->errlen] = 0; + } + + return; +} + +int +asn_check_constraints(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + struct errbufDesc arg; + int ret; + + arg.failed_type = 0; + arg.failed_struct_ptr = 0; + arg.errbuf = errbuf; + arg.errlen = errlen ? *errlen : 0; + + ret = type_descriptor->encoding_constraints.general_constraints( + type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg); + if(ret == -1 && errlen) *errlen = arg.errlen; + + return ret; +} + diff --git a/src/codec_utils/E2SMKPM/constraints.h b/src/codec_utils/E2SMKPM/constraints.h new file mode 100644 index 000000000..0bd86a96b --- /dev/null +++ b/src/codec_utils/E2SMKPM/constraints.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN1_CONSTRAINTS_VALIDATOR_H +#define ASN1_CONSTRAINTS_VALIDATOR_H + +#include /* Platform-dependent types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + * + * RETURN VALUES: + * This function returns 0 in case all ASN.1 constraints are met + * and -1 if one or more constraints were failed. + */ +int asn_check_constraints( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ +); + + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int(asn_constr_check_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, + asn_app_constraint_failed_f *optional_callback, /* Log the error */ + void *optional_app_key /* Opaque key passed to a callback */ +); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define ASN__CTFAIL if(ctfailcb) ctfailcb + +#ifdef __cplusplus +} +#endif + +#endif /* ASN1_CONSTRAINTS_VALIDATOR_H */ diff --git a/src/codec_utils/E2SMKPM/der_encoder.c b/src/codec_utils/E2SMKPM/der_encoder.c new file mode 100644 index 000000000..2c6a6f769 --- /dev/null +++ b/src/codec_utils/E2SMKPM/der_encoder.c @@ -0,0 +1,194 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, int constructed); + +/* + * The DER encoder of any type. + */ +asn_enc_rval_t +der_encode(const asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes, void *app_key) { + ASN_DEBUG("DER encoder invoked for %s", + type_descriptor->name); + + /* + * Invoke type-specific encoder. + */ + return type_descriptor->op->der_encoder( + type_descriptor, struct_ptr, /* Pointer to the destination structure */ + 0, 0, consume_bytes, app_key); +} + +/* + * Argument type and callback necessary for der_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +/* + * A variant of the der_encode() which encodes the data into the provided buffer + */ +asn_enc_rval_t +der_encode_to_buffer(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, void *buffer, size_t buffer_size) { + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = buffer_size; + + ec = type_descriptor->op->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); + /* Return the encoded contents size */ + } + return ec; +} + + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t +der_write_tags(const asn_TYPE_descriptor_t *sd, size_t struct_length, + int tag_mode, int last_tag_form, + ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ + asn_app_consume_bytes_f *cb, void *app_key) { +#define ASN1_DER_MAX_TAGS_COUNT 4 + ber_tlv_tag_t + tags_buf_scratch[ASN1_DER_MAX_TAGS_COUNT * sizeof(ber_tlv_tag_t)]; + ssize_t lens[ASN1_DER_MAX_TAGS_COUNT * sizeof(ssize_t)]; + const ber_tlv_tag_t *tags; /* Copy of tags stream */ + int tags_count; /* Number of tags */ + size_t overall_length; + int i; + + ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", + sd->name, tag_mode, sd->tags_count, + ber_tlv_tag_string(tag), + tag_mode + ?(sd->tags_count+1 + -((tag_mode == -1) && sd->tags_count)) + :sd->tags_count + ); + + if(sd->tags_count + 1 > ASN1_DER_MAX_TAGS_COUNT) { + ASN_DEBUG("System limit %d on tags count", ASN1_DER_MAX_TAGS_COUNT); + return -1; + } + + if(tag_mode) { + /* + * Instead of doing shaman dance like we do in ber_check_tags(), + * allocate a small array on the stack + * and initialize it appropriately. + */ + int stag_offset; + ber_tlv_tag_t *tags_buf = tags_buf_scratch; + tags_count = sd->tags_count + + 1 /* EXPLICIT or IMPLICIT tag is given */ + - ((tag_mode == -1) && sd->tags_count); + /* Copy tags over */ + tags_buf[0] = tag; + stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); + for(i = 1; i < tags_count; i++) + tags_buf[i] = sd->tags[i + stag_offset]; + tags = tags_buf; + } else { + tags = sd->tags; + tags_count = sd->tags_count; + } + + /* No tags to write */ + if(tags_count == 0) + return 0; + + /* + * Array of tags is initialized. + * Now, compute the size of the TLV pairs, from right to left. + */ + overall_length = struct_length; + for(i = tags_count - 1; i >= 0; --i) { + lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); + if(lens[i] == -1) return -1; + overall_length += lens[i]; + lens[i] = overall_length - lens[i]; + } + + if(!cb) return overall_length - struct_length; + + ASN_DEBUG("Encoding %s TL sequence (%d elements)", sd->name, + tags_count); + + /* + * Encode the TL sequence for real. + */ + for(i = 0; i < tags_count; i++) { + ssize_t len; + int _constr; + + /* Check if this tag happens to be constructed */ + _constr = (last_tag_form || i < (tags_count - 1)); + + len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); + if(len == -1) return -1; + } + + return overall_length - struct_length; +} + +static ssize_t +der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, + int constructed) { + uint8_t buf[32]; + size_t size = 0; + int buf_size = cb?sizeof(buf):0; + ssize_t tmp; + + /* Serialize tag (T from TLV) into possibly zero-length buffer */ + tmp = ber_tlv_tag_serialize(tag, buf, buf_size); + if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; + size += tmp; + + /* Serialize length (L from TLV) into possibly zero-length buffer */ + tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); + if(tmp == -1) return -1; + size += tmp; + + if(size > sizeof(buf)) + return -1; + + /* + * If callback is specified, invoke it, and check its return value. + */ + if(cb) { + if(constructed) *buf |= 0x20; + if(cb(buf, size, app_key) < 0) + return -1; + } + + return size; +} diff --git a/src/codec_utils/E2SMKPM/der_encoder.h b/src/codec_utils/E2SMKPM/der_encoder.h new file mode 100644 index 000000000..e93944edc --- /dev/null +++ b/src/codec_utils/E2SMKPM/der_encoder.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _DER_ENCODER_H_ +#define _DER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The DER encoder of any type. May be invoked by the application. + * Produces DER- and BER-compliant encoding. (DER is a subset of BER). + * + * NOTE: Use the ber_decode() function (ber_decoder.h) to decode data + * produced by der_encode(). + */ +asn_enc_rval_t der_encode(const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ +); + +/* A variant of der_encode() which encodes data into the pre-allocated buffer */ +asn_enc_rval_t der_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ +); + +/* + * Type of the generic DER encoder. + */ +typedef asn_enc_rval_t(der_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ +); + + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t der_write_tags(const struct asn_TYPE_descriptor_s *type_descriptor, + size_t struct_length, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {0,!0}: prim, constructed */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key); + +#ifdef __cplusplus +} +#endif + +#endif /* _DER_ENCODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/oer_decoder.c b/src/codec_utils/E2SMKPM/oer_decoder.c new file mode 100644 index 000000000..070173826 --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_decoder.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * The OER decoder of any type. + */ +asn_dec_rval_t +oer_decode(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *type_descriptor, void **struct_ptr, + const void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->op->oer_decoder(opt_codec_ctx, type_descriptor, 0, + struct_ptr, /* Pointer to the destination structure */ + ptr, size /* Buffer and its size */ + ); +} + +/* + * Open Type is encoded as a length (#8.6) followed by that number of bytes. + * Since we're just skipping, reading the length would be enough. + */ +ssize_t +oer_open_type_skip(const void *bufptr, size_t size) { + size_t len = 0; + return oer_fetch_length(bufptr, size, &len); +} + +/* + * Read the Open Type (X.696 (08/2015), #30). + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + */ +ssize_t +oer_open_type_get(const asn_codec_ctx_t *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *bufptr, size_t size) { + asn_dec_rval_t dr; + size_t container_len = 0; + ssize_t len_len; + enum asn_struct_free_method dispose_method = + (*struct_ptr) ? ASFM_FREE_UNDERLYING_AND_RESET : ASFM_FREE_EVERYTHING; + + /* Get the size of a length determinant */ + len_len = oer_fetch_length(bufptr, size, &container_len); + if(len_len <= 0) { + return len_len; /* Error or more data expected */ + } + + /* + * len_len can't be bigger than size, but size without len_len + * should be bigger or equal to container length + */ + if(size - len_len < container_len) { + /* More data is expected */ + return 0; + } + + dr = td->op->oer_decoder(opt_codec_ctx, td, constraints, struct_ptr, + (const uint8_t *)bufptr + len_len, container_len); + if(dr.code == RC_OK) { + return len_len + container_len; + } else { + /* Even if RC_WMORE, we can't get more data into a closed container. */ + td->op->free_struct(td, *struct_ptr, dispose_method); + *struct_ptr = NULL; + return -1; + } +} + + +asn_dec_rval_t +oer_decode_primitive(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **sptr, + const void *ptr, size_t size) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; + asn_dec_rval_t rval = {RC_OK, 0}; + size_t expected_length = 0; + ssize_t len_len; + + (void)td; + (void)opt_codec_ctx; + (void)constraints; + + if(!st) { + st = (ASN__PRIMITIVE_TYPE_t *)(*sptr = CALLOC( + 1, sizeof(ASN__PRIMITIVE_TYPE_t))); + if(!st) ASN__DECODE_FAILED; + } + + + /* + * X.696 (08/2015) #27.2 + * Encode length determinant as _number of octets_, but only + * if upper bound is not equal to lower bound. + */ + len_len = oer_fetch_length(ptr, size, &expected_length); + if(len_len > 0) { + rval.consumed = len_len; + ptr = (const char *)ptr + len_len; + size -= len_len; + } else if(len_len == 0) { + ASN__DECODE_STARVED; + } else if(len_len < 0) { + ASN__DECODE_FAILED; + } + + if(size < expected_length) { + ASN__DECODE_STARVED; + } else { + uint8_t *buf = MALLOC(expected_length + 1); + if(buf == NULL) { + ASN__DECODE_FAILED; + } else { + memcpy(buf, ptr, expected_length); + buf[expected_length] = '\0'; + } + FREEMEM(st->buf); + st->buf = buf; + st->size = expected_length; + + rval.consumed += expected_length; + return rval; + } +} diff --git a/src/codec_utils/E2SMKPM/oer_decoder.h b/src/codec_utils/E2SMKPM/oer_decoder.h new file mode 100644 index 000000000..40992e948 --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_decoder.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef OER_DECODER_H +#define OER_DECODER_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ + +/* + * The Octet Encoding Rules (OER, X.696 08/2015) decoder for any given type. + * This function may be invoked directly by the application. + * Parses CANONICAL-OER and BASIC-OER. + */ +asn_dec_rval_t oer_decode(const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef asn_dec_rval_t(oer_type_decoder_f)( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_oer_constraints_t *constraints, + void **struct_ptr, + const void *buf_ptr, + size_t size); + +/* + * Swallow the Open Type (X.696 (08/2015), #30) into /dev/null. + * RETURN VALUES: + * -1: Fatal error deciphering length. + * 0: More data expected than bufptr contains. + * >0: Number of bytes used from bufptr. + */ +ssize_t oer_open_type_skip(const void *bufptr, size_t size); + +/* + * Read the Open Type (X.696 (08/2015), #30). + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + */ +ssize_t oer_open_type_get(const asn_codec_ctx_t *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *td, + const asn_oer_constraints_t *constraints, + void **struct_ptr, const void *bufptr, size_t size); + +/* + * Length-prefixed buffer decoding for primitive types. + */ +oer_type_decoder_f oer_decode_primitive; + + +#ifdef __cplusplus +} +#endif + +#endif /* OER_DECODER_H */ diff --git a/src/codec_utils/E2SMKPM/oer_encoder.c b/src/codec_utils/E2SMKPM/oer_encoder.c new file mode 100644 index 000000000..a284cc2f3 --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_encoder.c @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* + * The OER encoder of any type. + */ +asn_enc_rval_t +oer_encode(const asn_TYPE_descriptor_t *type_descriptor, const void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes, void *app_key) { + ASN_DEBUG("OER encoder invoked for %s", type_descriptor->name); + + /* + * Invoke type-specific encoder. + */ + return type_descriptor->op->oer_encoder( + type_descriptor, 0, + struct_ptr, /* Pointer to the destination structure */ + consume_bytes, app_key); +} + +/* + * Argument type and callback necessary for oer_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int +encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +/* + * A variant of the oer_encode() which encodes the data into the provided buffer + */ +asn_enc_rval_t +oer_encode_to_buffer(const asn_TYPE_descriptor_t *type_descriptor, + const asn_oer_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ +) { + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = buffer_size; + + if(type_descriptor->op->oer_encoder == NULL) { + ec.encoded = -1; + ec.failed_type = type_descriptor; + ec.structure_ptr = struct_ptr; + ASN_DEBUG("OER encoder is not defined for %s", + type_descriptor->name); + } else { + ec = type_descriptor->op->oer_encoder( + type_descriptor, constraints, + struct_ptr, /* Pointer to the destination structure */ + encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); + /* Return the encoded contents size */ + } + } + return ec; +} + +asn_enc_rval_t +oer_encode_primitive(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const ASN__PRIMITIVE_TYPE_t *st = (const ASN__PRIMITIVE_TYPE_t *)sptr; + asn_enc_rval_t er = {0, 0, 0}; + ssize_t ret; + + (void)constraints; + + if(!st) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s (%" ASN_PRI_SIZE " bytes)", td ? td->name : "", st->size); + + /* + * X.696 (08/2015) #27.2 + */ + ret = oer_serialize_length(st->size, cb, app_key); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + er.encoded += ret; + + er.encoded += st->size; + if(cb(st->buf, st->size, app_key) < 0) { + ASN__ENCODE_FAILED; + } else { + ASN__ENCODED_OK(er); + } +} + +static int +oer__count_bytes(const void *buffer, size_t size, void *bytes_ptr) { + size_t *bytes = bytes_ptr; + (void)buffer; + *bytes += size; + return 0; +} + +ssize_t +oer_open_type_put(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t serialized_byte_count = 0; + asn_enc_rval_t er = {0,0,0}; + ssize_t len_len; + + er = td->op->oer_encoder(td, constraints, sptr, oer__count_bytes, + &serialized_byte_count); + if(er.encoded < 0) return -1; + assert(serialized_byte_count == (size_t)er.encoded); + + len_len = oer_serialize_length(serialized_byte_count, cb, app_key); + if(len_len == -1) return -1; + + er = td->op->oer_encoder(td, constraints, sptr, cb, app_key); + if(er.encoded < 0) return -1; + assert(serialized_byte_count == (size_t)er.encoded); + + return len_len + er.encoded; +} + diff --git a/src/codec_utils/E2SMKPM/oer_encoder.h b/src/codec_utils/E2SMKPM/oer_encoder.h new file mode 100644 index 000000000..6a7b68125 --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_encoder.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef OER_ENCODER_H +#define OER_ENCODER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The Octet Encoding Rules (OER, X.696 08/2015) encoder for any type. + * This function may be invoked directly by the application. + * Produces CANONICAL-OER output compatible with CANONICAL-OER + * and BASIC-OER decoders. + */ +asn_enc_rval_t oer_encode(const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ +); + +/* A variant of oer_encode() which encodes data into the pre-allocated buffer */ +asn_enc_rval_t oer_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_oer_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ +); + +/* + * Type of the generic OER encoder. + */ +typedef asn_enc_rval_t(oer_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_oer_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * Write out the Open Type (X.696 (08/2015), #30). + * RETURN VALUES: + * -1: Fatal error encoding the type. + * >0: Number of bytes serialized. + */ +ssize_t oer_open_type_put(const struct asn_TYPE_descriptor_s *td, + const asn_oer_constraints_t *constraints, + const void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key); + + +/* + * Length-prefixed buffer encoding for primitive types. + */ +oer_type_encoder_f oer_encode_primitive; + +#ifdef __cplusplus +} +#endif + +#endif /* OER_ENCODER_H */ diff --git a/src/codec_utils/E2SMKPM/oer_support.c b/src/codec_utils/E2SMKPM/oer_support.c new file mode 100644 index 000000000..b15a3bc93 --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_support.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +#include + +/* + * Fetch the length determinant (X.696 08/2015, #8.6) into *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + */ +ssize_t +oer_fetch_length(const void *bufptr, size_t size, size_t *len_r) { + uint8_t first_byte; + size_t len_len; /* Length of the length determinant */ + const uint8_t *b; + const uint8_t *bend; + size_t len; + + if(size == 0) { + *len_r = 0; + return 0; + } + + first_byte = *(const uint8_t *)bufptr; + if((first_byte & 0x80) == 0) { /* Short form */ + *len_r = first_byte; /* 0..127 */ + return 1; + } + + len_len = (first_byte & 0x7f); + if((1 + len_len) > size) { + *len_r = 0; + return 0; + } + + b = (const uint8_t *)bufptr + 1; + bend = b + len_len; + + for(; b < bend && *b == 0; b++) { + /* Skip the leading 0-bytes */ + } + + if((bend - b) > (ssize_t)sizeof(size_t)) { + /* Length is not representable by the native size_t type */ + *len_r = 0; + return -1; + } + + for(len = 0; b < bend; b++) { + len = (len << 8) + *b; + } + + if(len > RSIZE_MAX) { /* A bit of C11 validation */ + *len_r = 0; + return -1; + } + + *len_r = len; + assert(len_len + 1 == (size_t)(bend - (const uint8_t *)bufptr)); + return len_len + 1; +} + + +/* + * Serialize OER length. Returns the number of bytes serialized + * or -1 if a given callback returned with negative result. + */ +ssize_t +oer_serialize_length(size_t length, asn_app_consume_bytes_f *cb, + void *app_key) { + uint8_t scratch[1 + sizeof(length)]; + uint8_t *sp = scratch; + int littleEndian = 1; /* Run-time detection */ + const uint8_t *pstart; + const uint8_t *pend; + const uint8_t *p; + int add; + + if(length <= 127) { + uint8_t b = length; + if(cb(&b, 1, app_key) < 0) { + return -1; + } + return 1; + } + + if(*(char *)&littleEndian) { + pstart = (const uint8_t *)&length + sizeof(length) - 1; + pend = (const uint8_t *)&length; + add = -1; + } else { + pstart = (const uint8_t *)&length; + pend = pstart + sizeof(length); + add = 1; + } + + for(p = pstart; p != pend; p += add) { + /* Skip leading zeros. */ + if(*p) break; + } + + for(sp = scratch + 1; ; p += add) { + *sp++ = *p; + if(p == pend) break; + } + assert((sp - scratch) - 1 <= 0x7f); + scratch[0] = 0x80 + ((sp - scratch) - 1); + + if(cb(scratch, sp - scratch, app_key) < 0) { + return -1; + } + + return sp - scratch; +} + diff --git a/src/codec_utils/E2SMKPM/oer_support.h b/src/codec_utils/E2SMKPM/oer_support.h new file mode 100644 index 000000000..dbc9b5fcf --- /dev/null +++ b/src/codec_utils/E2SMKPM/oer_support.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef OER_SUPPORT_H +#define OER_SUPPORT_H + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pre-computed OER constraints. + */ +typedef struct asn_oer_constraint_number_s { + unsigned width; /* ±8,4,2,1 fixed bytes */ + unsigned positive; /* 1 for unsigned number, 0 for signed */ +} asn_oer_constraint_number_t; +typedef struct asn_oer_constraints_s { + asn_oer_constraint_number_t value; + ssize_t size; /* -1 (no constraint) or >= 0 */ +} asn_oer_constraints_t; + + +/* + * Fetch the length determinant (X.696 (08/2015), #8.6) into *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + */ +ssize_t oer_fetch_length(const void *bufptr, size_t size, size_t *len_r); + +/* + * Serialize OER length. Returns the number of bytes serialized + * or -1 if a given callback returned with negative result. + */ +ssize_t oer_serialize_length(size_t length, asn_app_consume_bytes_f *cb, void *app_key); + + +#ifdef __cplusplus +} +#endif + +#endif /* OER_SUPPORT_H */ diff --git a/src/codec_utils/E2SMKPM/per_decoder.c b/src/codec_utils/E2SMKPM/per_decoder.c new file mode 100644 index 000000000..8a3e39df8 --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_decoder.c @@ -0,0 +1,185 @@ +#include +#include +#include + +/* + * Decode a "Production of a complete encoding", X.691#10.1. + * The complete encoding contains at least one byte, and is an integral + * multiple of 8 bytes. + */ +asn_dec_rval_t +uper_decode_complete(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const void *buffer, size_t size) { + asn_dec_rval_t rval; + + rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); + if(rval.consumed) { + /* + * We've always given 8-aligned data, + * so convert bits to integral bytes. + */ + rval.consumed += 7; + rval.consumed >>= 3; + } else if(rval.code == RC_OK) { + if(size) { + if(((const uint8_t *)buffer)[0] == 0) { + rval.consumed = 1; /* 1 byte */ + } else { + ASN_DEBUG("Expecting single zeroed byte"); + rval.code = RC_FAIL; + } + } else { + /* Must contain at least 8 bits. */ + rval.code = RC_WMORE; + } + } + + return rval; +} + +asn_dec_rval_t +uper_decode(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, + size_t size, int skip_bits, int unused_bits) { + asn_codec_ctx_t s_codec_ctx; + asn_dec_rval_t rval; + asn_per_data_t pd; + + if(skip_bits < 0 || skip_bits > 7 + || unused_bits < 0 || unused_bits > 7 + || (unused_bits > 0 && !size)) + ASN__DECODE_FAILED; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* Fill in the position indicator */ + memset(&pd, 0, sizeof(pd)); + pd.buffer = (const uint8_t *)buffer; + pd.nboff = skip_bits; + pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ + if(pd.nboff > pd.nbits) + ASN__DECODE_FAILED; + + /* + * Invoke type-specific decoder. + */ + if(!td->op->uper_decoder) + ASN__DECODE_FAILED; /* PER is not compiled in */ + rval = td->op->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + if(rval.code == RC_OK) { + /* Return the number of consumed bits */ + rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + + pd.nboff - skip_bits; + ASN_DEBUG("PER decoding consumed %ld, counted %ld", + (long)rval.consumed, (long)pd.moved); + assert(rval.consumed == pd.moved); + } else { + /* PER codec is not a restartable */ + rval.consumed = 0; + } + return rval; +} + +asn_dec_rval_t +aper_decode_complete(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const void *buffer, size_t size) { + asn_dec_rval_t rval; + + rval = aper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); + if(rval.consumed) { + /* + * We've always given 8-aligned data, + * so convert bits to integral bytes. + */ + rval.consumed += 7; + rval.consumed >>= 3; + } else if(rval.code == RC_OK) { + if(size) { + if(((const uint8_t *)buffer)[0] == 0) { + rval.consumed = 1; /* 1 byte */ + } else { + ASN_DEBUG("Expecting single zeroed byte"); + rval.code = RC_FAIL; + } + } else { + /* Must contain at least 8 bits. */ + rval.code = RC_WMORE; + } + } + + return rval; +} + +asn_dec_rval_t +aper_decode(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, + size_t size, int skip_bits, int unused_bits) { + asn_codec_ctx_t s_codec_ctx; + asn_dec_rval_t rval; + asn_per_data_t pd; + + if(skip_bits < 0 || skip_bits > 7 + || unused_bits < 0 || unused_bits > 7 + || (unused_bits > 0 && !size)) + ASN__DECODE_FAILED; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* Fill in the position indicator */ + memset(&pd, 0, sizeof(pd)); + pd.buffer = (const uint8_t *)buffer; + pd.nboff = skip_bits; + pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ + if(pd.nboff > pd.nbits) + ASN__DECODE_FAILED; + + /* + * Invoke type-specific decoder. + */ + if(!td->op->aper_decoder) + ASN__DECODE_FAILED; /* PER is not compiled in */ + rval = td->op->aper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + if(rval.code == RC_OK) { + /* Return the number of consumed bits */ + rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + + pd.nboff - skip_bits; + ASN_DEBUG("PER decoding consumed %zu, counted %zu", + rval.consumed, pd.moved); + assert(rval.consumed == pd.moved); + } else { + /* PER codec is not a restartable */ + rval.consumed = 0; + } + return rval; +} + diff --git a/src/codec_utils/E2SMKPM/per_decoder.h b/src/codec_utils/E2SMKPM/per_decoder.h new file mode 100644 index 000000000..eea474a9e --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_decoder.h @@ -0,0 +1,82 @@ +/*- + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_DECODER_H_ +#define _PER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER decoder of a "complete encoding" as per X.691 (08/2015) #11.1. + * On success, this call always returns (.consumed >= 1), as per #11.1.3. + */ +asn_dec_rval_t uper_decode_complete( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ +); + +/* + * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. + * WARNING: This call returns the number of BITS read from the stream. Beware. + */ +asn_dec_rval_t uper_decode( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size, /* Size of the input data buffer, in bytes */ + int skip_bits, /* Number of unused leading bits, 0..7 */ + int unused_bits /* Number of unused tailing bits, 0..7 */ +); + +/* + * Aligned PER decoder of a "complete encoding" as per X.691#10.1. + * On success, this call always returns (.consumed >= 1), in BITS, as per X.691#10.1.3. + */ +asn_dec_rval_t aper_decode_complete( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + +/* + * Aligned PER decoder of any ASN.1 type. May be invoked by the application. + * WARNING: This call returns the number of BITS read from the stream. Beware. + */ +asn_dec_rval_t aper_decode( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size, /* Size of data buffer */ + int skip_bits, /* Number of unused leading bits, 0..7 */ + int unused_bits /* Number of unused tailing bits, 0..7 */ + ); + +/* + * Type of the type-specific PER decoder function. + */ +typedef asn_dec_rval_t(per_type_decoder_f)( + const asn_codec_ctx_t *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, void **struct_ptr, + asn_per_data_t *per_data); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_DECODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/per_encoder.c b/src/codec_utils/E2SMKPM/per_encoder.c new file mode 100644 index 000000000..a35e1f049 --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_encoder.c @@ -0,0 +1,265 @@ +#include +#include +#include + +static int _uper_encode_flush_outp(asn_per_outp_t *po); + +static int +ignore_output(const void *data, size_t size, void *app_key) { + (void)data; + (void)size; + (void)app_key; + return 0; +} + +asn_enc_rval_t +uper_encode(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_per_outp_t po; + asn_enc_rval_t er = {0,0,0}; + + /* + * Invoke type-specific encoder. + */ + if(!td || !td->op->uper_encoder) + ASN__ENCODE_FAILED; /* PER is not compiled in */ + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.output = cb ? cb : ignore_output; + po.op_key = app_key; + po.flushed_bytes = 0; + + er = td->op->uper_encoder(td, constraints, sptr, &po); + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_uper_encode_flush_outp(&po)) ASN__ENCODE_FAILED; + } + + return er; +} + +/* + * Argument type and callback necessary for uper_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +asn_enc_rval_t +uper_encode_to_buffer(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, void *buffer, size_t buffer_size) { + enc_to_buf_arg key; + + key.buffer = buffer; + key.left = buffer_size; + + if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); + + return uper_encode(td, constraints, sptr, encode_to_buffer_cb, &key); +} + +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +static int +encode_dyn_cb(const void *buffer, size_t size, void *key) { + enc_dyn_arg *arg = key; + if(arg->length + size >= arg->allocated) { + size_t new_size = arg->allocated ? arg->allocated : 8; + void *p; + + do { + new_size <<= 2; + } while(arg->length + size >= new_size); + + p = REALLOC(arg->buffer, new_size); + if(!p) { + FREEMEM(arg->buffer); + memset(arg, 0, sizeof(*arg)); + return -1; + } + arg->buffer = p; + arg->allocated = new_size; + } + memcpy(((char *)arg->buffer) + arg->length, buffer, size); + arg->length += size; + return 0; +} +ssize_t +uper_encode_to_new_buffer(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, void **buffer_r) { + asn_enc_rval_t er = {0,0,0}; + enc_dyn_arg key; + + memset(&key, 0, sizeof(key)); + + er = uper_encode(td, constraints, sptr, encode_dyn_cb, &key); + switch(er.encoded) { + case -1: + FREEMEM(key.buffer); + return -1; + case 0: + FREEMEM(key.buffer); + key.buffer = MALLOC(1); + if(key.buffer) { + *(char *)key.buffer = '\0'; + *buffer_r = key.buffer; + return 1; + } else { + return -1; + } + default: + *buffer_r = key.buffer; + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + return ((er.encoded + 7) >> 3); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ +static int +_uper_encode_flush_outp(asn_per_outp_t *po) { + uint8_t *buf; + + if(po->nboff == 0 && po->buffer == po->tmpspace) + return 0; + + buf = po->buffer + (po->nboff >> 3); + /* Make sure we account for the last, partially filled */ + if(po->nboff & 0x07) { + buf[0] &= 0xff << (8 - (po->nboff & 0x07)); + buf++; + } + + return po->output(po->tmpspace, buf - po->tmpspace, po->op_key); +} + +asn_enc_rval_t +aper_encode_to_buffer(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, void *buffer, size_t buffer_size) { + enc_to_buf_arg key; + + key.buffer = buffer; + key.left = buffer_size; + + if(td) ASN_DEBUG("Encoding \"%s\" using ALIGNED PER", td->name); + + return aper_encode(td, constraints, sptr, encode_to_buffer_cb, &key); +} + +ssize_t +aper_encode_to_new_buffer(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, void **buffer_r) { + asn_enc_rval_t er = {0,0,0}; + enc_dyn_arg key; + + memset(&key, 0, sizeof(key)); + + er = aper_encode(td, constraints, sptr, encode_dyn_cb, &key); + switch(er.encoded) { + case -1: + FREEMEM(key.buffer); + return -1; + case 0: + FREEMEM(key.buffer); + key.buffer = MALLOC(1); + if(key.buffer) { + *(char *)key.buffer = '\0'; + *buffer_r = key.buffer; + return 1; + } else { + return -1; + } + default: + *buffer_r = key.buffer; + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + return ((er.encoded + 7) >> 3); + } +} + +static int +_aper_encode_flush_outp(asn_per_outp_t *po) { + uint8_t *buf; + + if(po->nboff == 0 && po->buffer == po->tmpspace) + return 0; + + buf = po->buffer + (po->nboff >> 3); + /* Make sure we account for the last, partially filled */ + if(po->nboff & 0x07) { + buf[0] &= 0xff << (8 - (po->nboff & 0x07)); + buf++; + } + + if (po->output) { + return po->output(po->tmpspace, buf - po->tmpspace, po->op_key); + } + return 0; +} + +asn_enc_rval_t +aper_encode(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + asn_per_outp_t po; + asn_enc_rval_t er = {0,0,0}; + + /* + * Invoke type-specific encoder. + */ + if(!td || !td->op->aper_encoder) + ASN__ENCODE_FAILED; /* PER is not compiled in */ + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.output = cb; + po.op_key = app_key; + po.flushed_bytes = 0; + + er = td->op->aper_encoder(td, constraints, sptr, &po); + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_aper_encode_flush_outp(&po)) + ASN__ENCODE_FAILED; + } + + return er; +} diff --git a/src/codec_utils/E2SMKPM/per_encoder.h b/src/codec_utils/E2SMKPM/per_encoder.h new file mode 100644 index 000000000..b615ef028 --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_encoder.h @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2006-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_ENCODER_H_ +#define _PER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) + */ +asn_enc_rval_t uper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +asn_enc_rval_t aper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ +asn_enc_rval_t uper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); + +asn_enc_rval_t aper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-packing + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); + +ssize_t +aper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *td, + const asn_per_constraints_t *constraints, + const void *sptr, + void **buffer_r +); + +/* + * Type of the generic PER encoder function. + */ +typedef asn_enc_rval_t(per_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, const void *struct_ptr, + asn_per_outp_t *per_output); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_ENCODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/per_opentype.c b/src/codec_utils/E2SMKPM/per_opentype.c new file mode 100644 index 000000000..28f3cb67d --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_opentype.c @@ -0,0 +1,533 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +typedef struct uper_ugot_key { + asn_per_data_t oldpd; /* Old per data source */ + size_t unclaimed; + size_t ot_moved; /* Number of bits moved by OT processing */ + int repeat; +} uper_ugot_key; + +static int uper_ugot_refill(asn_per_data_t *pd); +static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); +static asn_dec_rval_t uper_sot_suck(const asn_codec_ctx_t *, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd); + +/* + * Encode an "open type field". + * #10.1, #10.2 + */ +int +uper_open_type_put(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + void *buf; + void *bptr; + ssize_t size; + + ASN_DEBUG("Open type put %s ...", td->name); + + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + ASN_DEBUG("Open type put %s of length %" ASN_PRI_SSIZE " + overhead (1byte?)", td->name, + size); + + bptr = buf; + do { + int need_eom = 0; + ssize_t may_save = uper_put_length(po, size, &need_eom); + ASN_DEBUG("Prepending length %" ASN_PRI_SSIZE + " to %s and allowing to save %" ASN_PRI_SSIZE, + size, td->name, may_save); + if(may_save < 0) break; + if(per_put_many_bits(po, bptr, may_save * 8)) break; + bptr = (char *)bptr + may_save; + size -= may_save; + if(need_eom && uper_put_length(po, 0, 0)) { + FREEMEM(buf); + return -1; + } + } while(size); + + FREEMEM(buf); + if(size) return -1; + + return 0; +} + +static asn_dec_rval_t +uper_open_type_get_simple(const asn_codec_ctx_t *ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + asn_dec_rval_t rv; + ssize_t chunk_bytes; + int repeat; + uint8_t *buf = 0; + size_t bufLen = 0; + size_t bufSize = 0; + asn_per_data_t spd; + size_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s...", td->name); + + do { + chunk_bytes = uper_get_length(pd, -1, 0, &repeat); + if(chunk_bytes < 0) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + if(bufLen + chunk_bytes > bufSize) { + void *ptr; + bufSize = chunk_bytes + (bufSize << 2); + ptr = REALLOC(buf, bufSize); + if(!ptr) { + FREEMEM(buf); + ASN__DECODE_FAILED; + } + buf = ptr; + } + if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + bufLen += chunk_bytes; + } while(repeat); + + ASN_DEBUG("Getting open type %s encoded in %ld bytes", td->name, + (long)bufLen); + + memset(&spd, 0, sizeof(spd)); + spd.buffer = buf; + spd.nbits = bufLen << 3; + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->op->uper_decoder(ctx, td, constraints, sptr, &spd); + ASN_DEBUG_INDENT_ADD(-4); + + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if (((padding > 0 && padding < 8) || + /* X.691#10.1.3 */ + (spd.nboff == 0 && spd.nbits == 8 && spd.buffer == buf)) && + per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", (int)padding); + ASN__DECODE_FAILED; + } else { + ASN_DEBUG("No padding"); + } + } else { + FREEMEM(buf); + /* rv.code could be RC_WMORE, nonsense in this context */ + rv.code = RC_FAIL; /* Noone would give us more */ + } + + return rv; +} + +static asn_dec_rval_t CC_NOTUSED +uper_open_type_get_complex(const asn_codec_ctx_t *ctx, + const asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + uper_ugot_key arg; + asn_dec_rval_t rv; + ssize_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s from %s", td->name, + asn_bit_data_string(pd)); + arg.oldpd = *pd; + arg.unclaimed = 0; + arg.ot_moved = 0; + arg.repeat = 1; + pd->refill = uper_ugot_refill; + pd->refill_key = &arg; + pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ + pd->moved = 0; /* This now counts the open type size in bits */ + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->op->uper_decoder(ctx, td, constraints, sptr, pd); + ASN_DEBUG_INDENT_ADD(-4); + +#define UPDRESTOREPD do { \ + /* buffer and nboff are valid, preserve them. */ \ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ + pd->refill = arg.oldpd.refill; \ + pd->refill_key = arg.oldpd.refill_key; \ + } while(0) + + if(rv.code != RC_OK) { + UPDRESTOREPD; + return rv; + } + + ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d", td->name, + asn_bit_data_string(pd), + asn_bit_data_string(&arg.oldpd), + (int)arg.unclaimed, (int)arg.repeat); + + padding = pd->moved % 8; + if(padding) { + int32_t pvalue; + if(padding > 7) { + ASN_DEBUG("Too large padding %d in open type", + (int)padding); + rv.code = RC_FAIL; + UPDRESTOREPD; + return rv; + } + padding = 8 - padding; + ASN_DEBUG("Getting padding of %d bits", (int)padding); + pvalue = per_get_few_bits(pd, padding); + switch(pvalue) { + case -1: + ASN_DEBUG("Padding skip failed"); + UPDRESTOREPD; + ASN__DECODE_STARVED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", + (int)padding, (int)pvalue); + UPDRESTOREPD; + ASN__DECODE_FAILED; + } + } + if(pd->nboff != pd->nbits) { + ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, + asn_bit_data_string(pd), asn_bit_data_string(&arg.oldpd)); + if(1) { + UPDRESTOREPD; + ASN__DECODE_FAILED; + } else { + arg.unclaimed += pd->nbits - pd->nboff; + } + } + + /* Adjust pd back so it points to original data */ + UPDRESTOREPD; + + /* Skip data not consumed by the decoder */ + if(arg.unclaimed) { + ASN_DEBUG("Getting unclaimed %d", (int)arg.unclaimed); + switch(per_skip_bits(pd, arg.unclaimed)) { + case -1: + ASN_DEBUG("Claim of %d failed", (int)arg.unclaimed); + ASN__DECODE_STARVED; + case 0: + ASN_DEBUG("Got claim of %d", (int)arg.unclaimed); + break; + default: + /* Padding must be blank */ + ASN_DEBUG("Non-blank unconsumed padding"); + ASN__DECODE_FAILED; + } + arg.unclaimed = 0; + } + + if(arg.repeat) { + ASN_DEBUG("Not consumed the whole thing"); + rv.code = RC_FAIL; + return rv; + } + + return rv; +} + + +asn_dec_rval_t +uper_open_type_get(const asn_codec_ctx_t *ctx, const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + return uper_open_type_get_simple(ctx, td, constraints, sptr, pd); +} + +int +uper_open_type_skip(const asn_codec_ctx_t *ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; + asn_TYPE_operation_t s_op; + asn_dec_rval_t rv; + + s_td.name = ""; + s_td.op = &s_op; + s_op.uper_decoder = uper_sot_suck; + + rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + +/* + * Internal functions. + */ + +static asn_dec_rval_t +uper_sot_suck(const asn_codec_ctx_t *ctx, const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)ctx; + (void)td; + (void)constraints; + (void)sptr; + + while(per_get_few_bits(pd, 1) >= 0); + + rv.code = RC_OK; + rv.consumed = pd->moved; + + return rv; +} + +static int +uper_ugot_refill(asn_per_data_t *pd) { + uper_ugot_key *arg = pd->refill_key; + ssize_t next_chunk_bytes, next_chunk_bits; + ssize_t avail; + + asn_per_data_t *oldpd = &arg->oldpd; + + ASN_DEBUG("REFILLING pd->moved=%ld, oldpd->moved=%ld", + (long)pd->moved, (long)oldpd->moved); + + /* Advance our position to where pd is */ + oldpd->buffer = pd->buffer; + oldpd->nboff = pd->nboff; + oldpd->nbits -= pd->moved - arg->ot_moved; + oldpd->moved += pd->moved - arg->ot_moved; + arg->ot_moved = pd->moved; + + if(arg->unclaimed) { + /* Refill the container */ + if(per_get_few_bits(oldpd, 1)) + return -1; + if(oldpd->nboff == 0) { + assert(0); + return -1; + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff - 1; + pd->nbits = oldpd->nbits; + ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%ld)", + (long)pd->moved); + return 0; + } + + if(!arg->repeat) { + ASN_DEBUG("Want more but refill doesn't have it"); + return -1; + } + + next_chunk_bytes = uper_get_length(oldpd, -1, 0, &arg->repeat); + ASN_DEBUG("Open type LENGTH %ld bytes at off %ld, repeat %ld", + (long)next_chunk_bytes, (long)oldpd->moved, (long)arg->repeat); + if(next_chunk_bytes < 0) return -1; + if(next_chunk_bytes == 0) { + pd->refill = 0; /* No more refills, naturally */ + assert(!arg->repeat); /* Implementation guarantee */ + } + next_chunk_bits = next_chunk_bytes << 3; + avail = oldpd->nbits - oldpd->nboff; + if(avail >= next_chunk_bits) { + pd->nbits = oldpd->nboff + next_chunk_bits; + arg->unclaimed = 0; + ASN_DEBUG("!+Parent frame %ld bits, alloting %ld [%ld..%ld] (%ld)", + (long)next_chunk_bits, (long)oldpd->moved, + (long)oldpd->nboff, (long)oldpd->nbits, + (long)(oldpd->nbits - oldpd->nboff)); + } else { + pd->nbits = oldpd->nbits; + arg->unclaimed = next_chunk_bits - avail; + ASN_DEBUG("!-Parent frame %ld, require %ld, will claim %ld", + (long)avail, (long)next_chunk_bits, + (long)arg->unclaimed); + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; + ASN_DEBUG("Refilled pd%s old%s", + asn_bit_data_string(pd), asn_bit_data_string(oldpd)); + return 0; +} + +static int +per_skip_bits(asn_per_data_t *pd, int skip_nbits) { + int hasNonZeroBits = 0; + while(skip_nbits > 0) { + int skip; + + /* per_get_few_bits() is more efficient when nbits <= 24 */ + if(skip_nbits < 24) + skip = skip_nbits; + else + skip = 24; + skip_nbits -= skip; + + switch(per_get_few_bits(pd, skip)) { + case -1: return -1; /* Starving */ + case 0: continue; /* Skipped empty space */ + default: hasNonZeroBits = 1; continue; + } + } + return hasNonZeroBits; +} + +static asn_dec_rval_t +aper_open_type_get_simple(const asn_codec_ctx_t *ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + ssize_t chunk_bytes; + int repeat; + uint8_t *buf = 0; + size_t bufLen = 0; + size_t bufSize = 0; + asn_per_data_t spd; + size_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s...", td->name); + + do { + chunk_bytes = aper_get_length(pd, -1, -1, &repeat); + if(chunk_bytes < 0) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + if(bufLen + chunk_bytes > bufSize) { + void *ptr; + bufSize = chunk_bytes + (bufSize << 2); + ptr = REALLOC(buf, bufSize); + if(!ptr) { + FREEMEM(buf); + ASN__DECODE_FAILED; + } + buf = ptr; + } + if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + bufLen += chunk_bytes; + } while(repeat); + + ASN_DEBUG("Getting open type %s encoded in %ld bytes", td->name, + (long)bufLen); + + memset(&spd, 0, sizeof(spd)); + spd.buffer = buf; + spd.nbits = bufLen << 3; + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->op->aper_decoder(ctx, td, constraints, sptr, &spd); + ASN_DEBUG_INDENT_ADD(-4); + + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if (((padding > 0 && padding < 8) || + /* X.691#10.1.3 */ + (spd.nboff == 0 && spd.nbits == 8 && spd.buffer == buf)) && + per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", (int)padding); + ASN__DECODE_FAILED; + } else { + ASN_DEBUG("No padding"); + } + } else { + FREEMEM(buf); + /* rv.code could be RC_WMORE, nonsense in this context */ + rv.code = RC_FAIL; /* Noone would give us more */ + } + + return rv; +} + +int +aper_open_type_put(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + void *buf; + void *bptr; + ssize_t size; + size_t toGo; + + ASN_DEBUG("Open type put %s ...", td->name); + + size = aper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + for(bptr = buf, toGo = size; toGo;) { + ssize_t maySave = aper_put_length(po, -1, toGo); + if(maySave < 0) break; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; + } + + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %ld + overhead (1byte?)", + td->name, size); + + return 0; +} + +asn_dec_rval_t +aper_open_type_get(const asn_codec_ctx_t *ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + + return aper_open_type_get_simple(ctx, td, constraints, sptr, pd); +} + +int +aper_open_type_skip(const asn_codec_ctx_t *ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; + asn_dec_rval_t rv; + asn_TYPE_operation_t op_t; + + memset(&op_t, 0, sizeof(op_t)); + s_td.name = ""; + s_td.op = &op_t; + s_td.op->aper_decoder = uper_sot_suck; + + rv = aper_open_type_get(ctx, &s_td, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + + diff --git a/src/codec_utils/E2SMKPM/per_opentype.h b/src/codec_utils/E2SMKPM/per_opentype.h new file mode 100644 index 000000000..1493b2d8e --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_opentype.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2007-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_OPENTYPE_H_ +#define _PER_OPENTYPE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +asn_dec_rval_t uper_open_type_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd); + +int uper_open_type_skip(const asn_codec_ctx_t *opt_codec_ctx, + asn_per_data_t *pd); + +/* + * X.691 (2015/08), #11.2 + * Returns -1 if error is encountered. 0 if all OK. + */ +int uper_open_type_put(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po); + +asn_dec_rval_t aper_open_type_get(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd); + + +int aper_open_type_skip(const asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); + +int aper_open_type_put(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_OPENTYPE_H_ */ diff --git a/src/codec_utils/E2SMKPM/per_support.c b/src/codec_utils/E2SMKPM/per_support.c new file mode 100644 index 000000000..228567760 --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_support.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * X.691-201508 #10.9 General rules for encoding a length determinant. + * Get the optionally constrained length "n" from the stream. + */ +ssize_t +uper_get_length(asn_per_data_t *pd, int ebits, size_t lower_bound, + int *repeat) { + ssize_t value; + + *repeat = 0; + + /* #11.9.4.1 Encoding if constrained (according to effective bits) */ + if(ebits >= 0 && ebits <= 16) { + value = per_get_few_bits(pd, ebits); + if(value >= 0) value += lower_bound; + return value; + } + + value = per_get_few_bits(pd, 8); + if((value & 0x80) == 0) { /* #11.9.3.6 */ + return (value & 0x7F); + } else if((value & 0x40) == 0) { /* #11.9.3.7 */ + /* bit 8 ... set to 1 and bit 7 ... set to zero */ + value = ((value & 0x3f) << 8) | per_get_few_bits(pd, 8); + return value; /* potential -1 from per_get_few_bits passes through. */ + } else if(value < 0) { + ASN_DEBUG("END of stream reached for PER"); + return -1; + } + value &= 0x3f; /* this is "m" from X.691, #11.9.3.8 */ + if(value < 1 || value > 4) { + return -1; /* Prohibited by #11.9.3.8 */ + } + *repeat = 1; + return (16384 * value); +} + +/* + * Get the normally small length "n". + * This procedure used to decode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +ssize_t +uper_get_nslength(asn_per_data_t *pd) { + ssize_t length; + + ASN_DEBUG("Getting normally small length"); + + if(per_get_few_bits(pd, 1) == 0) { + length = per_get_few_bits(pd, 6) + 1; + if(length <= 0) return -1; + ASN_DEBUG("l=%d", (int)length); + return length; + } else { + int repeat; + length = uper_get_length(pd, -1, 0, &repeat); + if(length >= 0 && !repeat) return length; + return -1; /* Error, or do not support >16K extensions */ + } +} + +/* + * Get the normally small non-negative whole number. + * X.691, #10.6 + */ +ssize_t +uper_get_nsnnwn(asn_per_data_t *pd) { + ssize_t value; + + value = per_get_few_bits(pd, 7); + if(value & 64) { /* implicit (value < 0) */ + value &= 63; + value <<= 2; + value |= per_get_few_bits(pd, 2); + if(value & 128) /* implicit (value < 0) */ + return -1; + if(value == 0) + return 0; + if(value >= 3) + return -1; + value = per_get_few_bits(pd, 8 * value); + return value; + } + + return value; +} + +/* + * X.691-11/2008, #11.6 + * Encoding of a normally small non-negative whole number + */ +int +uper_put_nsnnwn(asn_per_outp_t *po, int n) { + int bytes; + + if(n <= 63) { + if(n < 0) return -1; + return per_put_few_bits(po, n, 7); + } + if(n < 256) + bytes = 1; + else if(n < 65536) + bytes = 2; + else if(n < 256 * 65536) + bytes = 3; + else + return -1; /* This is not a "normally small" value */ + if(per_put_few_bits(po, bytes, 8)) + return -1; + + return per_put_few_bits(po, n, 8 * bytes); +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *out_value, int nbits) { + unsigned long lhalf; /* Lower half of the number*/ + long half; + + if(nbits <= 31) { + half = per_get_few_bits(pd, nbits); + if(half < 0) return -1; + *out_value = half; + return 0; + } + + if((size_t)nbits > 8 * sizeof(*out_value)) + return -1; /* RANGE */ + + half = per_get_few_bits(pd, 31); + if(half < 0) return -1; + + if(uper_get_constrained_whole_number(pd, &lhalf, nbits - 31)) + return -1; + + *out_value = ((unsigned long)half << (nbits - 31)) | lhalf; + return 0; +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int +uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, + int nbits) { + if(nbits <= 31) { + return per_put_few_bits(po, v, nbits); + } else { + /* Put higher portion first, followed by lower 31-bit */ + if(uper_put_constrained_whole_number_u(po, v >> 31, nbits - 31)) + return -1; + return per_put_few_bits(po, v, 31); + } +} + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Put the length "n" (or part of it) into the stream. + */ +ssize_t +uper_put_length(asn_per_outp_t *po, size_t length, int *need_eom) { + int dummy = 0; + if(!need_eom) need_eom = &dummy; + + if(length <= 127) { /* #11.9.3.6 */ + *need_eom = 0; + return per_put_few_bits(po, length, 8) + ? -1 : (ssize_t)length; + } else if(length < 16384) { /* #10.9.3.7 */ + *need_eom = 0; + return per_put_few_bits(po, length|0x8000, 16) + ? -1 : (ssize_t)length; + } + + *need_eom = 0 == (length & 16383); + length >>= 14; + if(length > 4) { + *need_eom = 0; + length = 4; + } + + return per_put_few_bits(po, 0xC0 | length, 8) + ? -1 : (ssize_t)(length << 14); + +} + + +/* + * Put the normally small length "n" into the stream. + * This procedure used to encode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +int +uper_put_nslength(asn_per_outp_t *po, size_t length) { + if(length <= 64) { + /* #11.9.3.4 */ + if(length == 0) return -1; + return per_put_few_bits(po, length - 1, 7) ? -1 : 0; + } else { + int need_eom = 0; + if(uper_put_length(po, length, &need_eom) != (ssize_t)length + || need_eom) { + /* This might happen in case of >16K extensions */ + return -1; + } + } + + return 0; +} + +static int +per__long_range(long lb, long ub, unsigned long *range_r) { + unsigned long bounds_range; + if((ub < 0) == (lb < 0)) { + bounds_range = ub - lb; + } else if(lb < 0) { + assert(ub >= 0); + bounds_range = 1 + ((unsigned long)ub + (unsigned long)-(lb + 1)); + } else { + assert(!"Unreachable"); + return -1; + } + *range_r = bounds_range; + return 0; +} + +int +per_long_range_rebase(long v, long lb, long ub, unsigned long *output) { + unsigned long range; + + assert(lb <= ub); + + if(v < lb || v > ub || per__long_range(lb, ub, &range) < 0) { + /* Range error. */ + return -1; + } + + /* + * Fundamentally what we're doing is returning (v-lb). + * However, this triggers undefined behavior when the word width + * of signed (v) is the same as the size of unsigned (*output). + * In practice, it triggers the UndefinedSanitizer. Therefore we shall + * compute the ranges accurately to avoid C's undefined behavior. + */ + if((v < 0) == (lb < 0)) { + *output = v-lb; + return 0; + } else if(v < 0) { + unsigned long rebased = 1 + (unsigned long)-(v+1) + (unsigned long)lb; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else if(lb < 0) { + unsigned long rebased = 1 + (unsigned long)-(lb+1) + (unsigned long)v; + assert(rebased <= range); /* By construction */ + *output = rebased; + return 0; + } else { + assert(!"Unreachable"); + return -1; + } +} + +int +per_long_range_unrebase(unsigned long inp, long lb, long ub, long *outp) { + unsigned long range; + + if(per__long_range(lb, ub, &range) != 0) { + return -1; + } + + if(inp > range) { + /* + * We can encode something in the given number of bits that technically + * exceeds the range. This is an avenue for security errors, + * so we don't allow that. + */ + return -1; + } + + if(inp <= LONG_MAX) { + *outp = (long)inp + lb; + } else { + *outp = (lb + LONG_MAX + 1) + (long)((inp - LONG_MAX) - 1); + } + + return 0; +} + +int32_t +aper_get_align(asn_per_data_t *pd) { + + if(pd->nboff & 0x7) { + ASN_DEBUG("Aligning %ld bits", 8 - ((unsigned long)pd->nboff & 0x7)); + return per_get_few_bits(pd, 8 - (pd->nboff & 0x7)); + } + return 0; +} + +ssize_t +aper_get_length(asn_per_data_t *pd, int range, int ebits, int *repeat) { + ssize_t value; + + *repeat = 0; + + if (range <= 65536 && range >= 0) + return aper_get_nsnnwn(pd, range); + + if (aper_get_align(pd) < 0) + return -1; + + if(ebits >= 0) return per_get_few_bits(pd, ebits); + + value = per_get_few_bits(pd, 8); + if(value < 0) return -1; + if((value & 128) == 0) /* #10.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #10.9.3.7 */ + value = ((value & 63) << 8) | per_get_few_bits(pd, 8); + if(value < 0) return -1; + return value; + } + value &= 63; /* this is "m" from X.691, #10.9.3.8 */ + if(value < 1 || value > 4) + return -1; + *repeat = 1; + return (16384 * value); +} + +ssize_t +aper_get_nslength(asn_per_data_t *pd) { + ssize_t length; + + ASN_DEBUG("Getting normally small length"); + + if(per_get_few_bits(pd, 1) == 0) { + length = per_get_few_bits(pd, 6) + 1; + if(length <= 0) return -1; + ASN_DEBUG("l=%ld", length); + return length; + } else { + int repeat; + length = aper_get_length(pd, -1, -1, &repeat); + if(length >= 0 && !repeat) return length; + return -1; /* Error, or do not support >16K extensions */ + } +} + +ssize_t +aper_get_nsnnwn(asn_per_data_t *pd, int range) { + ssize_t value; + int bytes = 0; + + ASN_DEBUG("getting nsnnwn with range %d", range); + + if(range <= 255) { + int i; + + if (range < 0) return -1; + /* 1 -> 8 bits */ + for (i = 1; i <= 8; i++) { + int upper = 1 << i; + if (upper >= range) + break; + } + value = per_get_few_bits(pd, i); + return value; + } else if (range == 256){ + /* 1 byte */ + bytes = 1; + } else if (range <= 65536) { + /* 2 bytes */ + bytes = 2; + } else { + return -1; + } + if (aper_get_align(pd) < 0) + return -1; + value = per_get_few_bits(pd, 8 * bytes); + return value; +} + +int aper_put_align(asn_per_outp_t *po) { + + if(po->nboff & 0x7) { + ASN_DEBUG("Aligning %ld bits", 8 - ((unsigned long)po->nboff & 0x7)); + if(per_put_few_bits(po, 0x00, (8 - (po->nboff & 0x7)))) + return -1; + } + return 0; +} + +ssize_t +aper_put_length(asn_per_outp_t *po, int range, size_t length) { + + ASN_DEBUG("APER put length %zu with range %d", length, range); + + /* 10.9 X.691 Note 2 */ + if (range <= 65536 && range >= 0) + return aper_put_nsnnwn(po, range, length); + + if (aper_put_align(po) < 0) + return -1; + + if(length <= 127) /* #10.9.3.6 */{ + return per_put_few_bits(po, length, 8) + ? -1 : (ssize_t)length; + } + else if(length < 16384) /* #10.9.3.7 */ + return per_put_few_bits(po, length|0x8000, 16) + ? -1 : (ssize_t)length; + + length >>= 14; + if(length > 4) length = 4; + + return per_put_few_bits(po, 0xC0 | length, 8) + ? -1 : (ssize_t)(length << 14); +} + + +int +aper_put_nslength(asn_per_outp_t *po, size_t length) { + + if(length <= 64) { + /* #10.9.3.4 */ + if(length == 0) return -1; + return per_put_few_bits(po, length-1, 7) ? -1 : 0; + } else { + if(aper_put_length(po, -1, length) != (ssize_t)length) { + /* This might happen in case of >16K extensions */ + return -1; + } + } + + return 0; +} + +int +aper_put_nsnnwn(asn_per_outp_t *po, int range, int number) { + int bytes; + + ASN_DEBUG("aper put nsnnwn %d with range %d", number, range); + /* 10.5.7.1 X.691 */ + if(range < 0) { + int i; + for (i = 1; ; i++) { + int bits = 1 << (8 * i); + if (number <= bits) + break; + } + bytes = i; + assert(i <= 4); + } + if(range <= 255) { + int i; + for (i = 1; i <= 8; i++) { + int bits = 1 << i; + if (range <= bits) + break; + } + return per_put_few_bits(po, number, i); + } else if(range == 256) { + bytes = 1; + } else if(range <= 65536) { + bytes = 2; + } else { /* Ranges > 64K */ + int i; + for (i = 1; ; i++) { + int bits = 1 << (8 * i); + if (range <= bits) + break; + } + assert(i <= 4); + bytes = i; + } + if(aper_put_align(po) < 0) /* Aligning on octet */ + return -1; +/* if(per_put_few_bits(po, bytes, 8)) + return -1; +*/ + return per_put_few_bits(po, number, 8 * bytes); +} diff --git a/src/codec_utils/E2SMKPM/per_support.h b/src/codec_utils/E2SMKPM/per_support.h new file mode 100644 index 000000000..23079c94f --- /dev/null +++ b/src/codec_utils/E2SMKPM/per_support.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2005-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_SUPPORT_H_ +#define _PER_SUPPORT_H_ + +#include /* Platform-specific types */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pre-computed PER constraints. + */ +typedef struct asn_per_constraint_s { + enum asn_per_constraint_flags { + APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ + APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ + APC_CONSTRAINED = 0x2, /* Fully constrained */ + APC_EXTENSIBLE = 0x4 /* May have extension */ + } flags; + int range_bits; /* Full number of bits in the range */ + int effective_bits; /* Effective bits */ + long lower_bound; /* "lb" value */ + long upper_bound; /* "ub" value */ +} asn_per_constraint_t; +typedef struct asn_per_constraints_s { + asn_per_constraint_t value; + asn_per_constraint_t size; + int (*value2code)(unsigned int value); + int (*code2value)(unsigned int code); +} asn_per_constraints_t; + +/* Temporary compatibility layer. Will get removed. */ +typedef struct asn_bit_data_s asn_per_data_t; +#define per_get_few_bits(data, bits) asn_get_few_bits(data, bits) +#define per_get_undo(data, bits) asn_get_undo(data, bits) +#define per_get_many_bits(data, dst, align, bits) \ + asn_get_many_bits(data, dst, align, bits) + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Get the length "n" from the Unaligned PER stream. + */ +ssize_t uper_get_length(asn_per_data_t *pd, int effective_bound_bits, + size_t lower_bound, int *repeat); + +ssize_t aper_get_length(asn_per_data_t *pd, int range, + int effective_bound_bits, int *repeat); + +/* + * Get the normally small length "n". + */ +ssize_t uper_get_nslength(asn_per_data_t *pd); +ssize_t aper_get_nslength(asn_per_data_t *pd); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t uper_get_nsnnwn(asn_per_data_t *pd); +ssize_t aper_get_nsnnwn(asn_per_data_t *pd, int range); + +/* X.691-2008/11, #11.5.6 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *v, int nbits); + + +/* Temporary compatibility layer. Will get removed. */ +typedef struct asn_bit_outp_s asn_per_outp_t; +#define per_put_few_bits(out, bits, obits) asn_put_few_bits(out, bits, obits) +#define per_put_many_bits(out, src, nbits) asn_put_many_bits(out, src, nbits) +#define per_put_aligned_flush(out) asn_put_aligned_flush(out) + + +/* + * Rebase the given value as an offset into the range specified by the + * lower bound (lb) and upper bound (ub). + * RETURN VALUES: + * -1: Conversion failed due to range problems. + * 0: Conversion was successful. + */ +int per_long_range_rebase(long v, long lb, long ub, unsigned long *output); +/* The inverse operation: restores the value by the offset and its bounds. */ +int per_long_range_unrebase(unsigned long inp, long lb, long ub, long *outp); + +/* X.691-2008/11, #11.5 */ +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits); + +/* + * X.691 (08/2015) #11.9 "General rules for encoding a length determinant" + * Put the length "whole_length" to the Unaligned PER stream. + * If (opt_need_eom) is given, it will be set to 1 if final 0-length is needed. + * In that case, invoke uper_put_length(po, 0, 0) after encoding the last block. + * This function returns the number of units which may be flushed + * in the next units saving iteration. + */ +ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length, + int *opt_need_eom); + +ssize_t aper_put_length(asn_per_outp_t *po, int range, size_t length); + +/* Align the current bit position to octet bundary */ +int aper_put_align(asn_per_outp_t *po); +int32_t aper_get_align(asn_per_data_t *pd); + +/* + * Put the normally small length "n" to the Unaligned PER stream. + * Returns 0 or -1. + */ +int uper_put_nslength(asn_per_outp_t *po, size_t length); + +int aper_put_nslength(asn_per_outp_t *po, size_t length); + +/* + * Put the normally small non-negative whole number. + */ +int uper_put_nsnnwn(asn_per_outp_t *po, int n); + +int aper_put_nsnnwn(asn_per_outp_t *po, int range, int number); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_SUPPORT_H_ */ diff --git a/src/codec_utils/E2SMKPM/xer_decoder.c b/src/codec_utils/E2SMKPM/xer_decoder.c new file mode 100644 index 000000000..5b87703a3 --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_decoder.c @@ -0,0 +1,369 @@ +/* + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* XER/XML parsing support */ + + +/* + * Decode the XER encoding of a given type. + */ +asn_dec_rval_t +xer_decode(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *buffer, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return td->op->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); +} + + + +struct xer__cb_arg { + pxml_chunk_type_e chunk_type; + size_t chunk_size; + const void *chunk_buf; + int callback_not_invoked; +}; + +static int +xer__token_cb(pxml_chunk_type_e type, const void *_chunk_data, size_t _chunk_size, void *key) { + struct xer__cb_arg *arg = (struct xer__cb_arg *)key; + arg->chunk_type = type; + arg->chunk_size = _chunk_size; + arg->chunk_buf = _chunk_data; + arg->callback_not_invoked = 0; + return -1; /* Terminate the XML parsing */ +} + +/* + * Fetch the next token from the XER/XML stream. + */ +ssize_t +xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *ch_type) { + struct xer__cb_arg arg; + int new_stateContext = *stateContext; + ssize_t ret; + + arg.callback_not_invoked = 1; + ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); + if(ret < 0) return -1; + if(arg.callback_not_invoked) { + assert(ret == 0); /* No data was consumed */ + *ch_type = PXER_WMORE; + return 0; /* Try again with more data */ + } else { + assert(arg.chunk_size); + assert(arg.chunk_buf == buffer); + } + + /* + * Translate the XML chunk types into more convenient ones. + */ + switch(arg.chunk_type) { + case PXML_TEXT: + *ch_type = PXER_TEXT; + break; + case PXML_TAG: + *ch_type = PXER_WMORE; + return 0; /* Want more */ + case PXML_TAG_END: + *ch_type = PXER_TAG; + break; + case PXML_COMMENT: + case PXML_COMMENT_END: + *ch_type = PXER_COMMENT; + break; + } + + *stateContext = new_stateContext; + return arg.chunk_size; +} + +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define RANGLE 0x3e /* '>' */ + +xer_check_tag_e +xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { + const char *buf = (const char *)buf_ptr; + const char *end; + xer_check_tag_e ct = XCT_OPENING; + + if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { + if(size >= 2) + ASN_DEBUG("Broken XML tag: \"%c...%c\"", + buf[0], buf[size - 1]); + return XCT_BROKEN; + } + + /* + * Determine the tag class. + */ + if(buf[1] == CSLASH) { + buf += 2; /* advance past "" */ + ct = XCT_CLOSING; + if(size > 0 && buf[size-1] == CSLASH) + return XCT_BROKEN; /* */ + } else { + buf++; /* advance past "<" */ + size -= 2; /* strip "<" and ">" */ + if(size > 0 && buf[size-1] == CSLASH) { + ct = XCT_BOTH; + size--; /* One more, for "/" */ + } + } + + /* Sometimes we don't care about the tag */ + if(!need_tag || !*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + /* + * Determine the tag name. + */ + for(end = buf + size; buf < end; buf++, need_tag++) { + int b = *buf, n = *need_tag; + if(b != n) { + if(n == 0) { + switch(b) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* "": whitespace is normal */ + return ct; + } + } + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + } + if(b == 0) + return XCT_BROKEN; /* Embedded 0 in buf?! */ + } + if(*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + return ct; +} + + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + if(rval.code != RC_OK) \ + ASN_DEBUG("Failed with %d", rval.code); \ + return rval; \ + } while(0) + +#define XER_GOT_BODY(chunk_buf, chunk_size, size) do { \ + ssize_t converted_size = body_receiver \ + (struct_key, chunk_buf, chunk_size, \ + (size_t)chunk_size < size); \ + if(converted_size == -1) RETURN(RC_FAIL); \ + if(converted_size == 0 \ + && size == (size_t)chunk_size) \ + RETURN(RC_WMORE); \ + chunk_size = converted_size; \ + } while(0) +#define XER_GOT_EMPTY() do { \ + if(body_receiver(struct_key, 0, 0, size > 0) == -1) \ + RETURN(RC_FAIL); \ + } while(0) + +/* + * Generalized function for decoding the primitive values. + */ +asn_dec_rval_t +xer_decode_general(const asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, + const char *xml_tag, /* Expected XML tag */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_key, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_key, const void *chunk_buf, size_t chunk_size, + int have_more) + ) { + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; + + (void)opt_codec_ctx; + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + */ + if(ctx->phase > 1) RETURN(RC_FAIL); + for(;;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TEXT: + if(ctx->phase == 0) { + /* + * We have to ignore whitespace here, + * but in order to be forward compatible + * with EXTENDED-XER (EMBED-VALUES, #25) + * any text is just ignored here. + */ + } else { + XER_GOT_BODY(buf_ptr, ch_size, size); + } + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + assert(ch_type == PXER_TAG && size); + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + /* + * Phase 0: + * Expecting the opening tag + * for the type being processed. + * Phase 1: + * Waiting for the closing XML tag. + */ + switch(tcv) { + case XCT_BOTH: + if(ctx->phase) break; + /* Finished decoding of an empty element */ + XER_GOT_EMPTY(); + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + case XCT_CLOSING: + if(!ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_UNKNOWN_BO: + /* + * Certain tags in the body may be expected. + */ + if(opt_unexpected_tag_decoder + && opt_unexpected_tag_decoder(struct_key, + buf_ptr, ch_size) >= 0) { + /* Tag's processed fine */ + ADVANCE(ch_size); + if(!ctx->phase) { + /* We are not expecting + * the closing tag anymore. */ + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + } + continue; + } + /* Fall through */ + default: + break; /* Unexpected tag */ + } + + ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag); + break; /* Dark and mysterious things have just happened */ + } + + RETURN(RC_FAIL); +} + + +size_t +xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + + for(; p < pend; p++) { + switch(*p) { + /* X.693, #8.1.4 + * HORISONTAL TAB (9) + * LINE FEED (10) + * CARRIAGE RETURN (13) + * SPACE (32) + */ + case 0x09: case 0x0a: case 0x0d: case 0x20: + continue; + default: + break; + } + break; + } + return (p - (const char *)chunk_buf); +} + +/* + * This is a vastly simplified, non-validating XML tree skipper. + */ +int +xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { + assert(*depth > 0); + switch(tcv) { + case XCT_BOTH: + case XCT_UNKNOWN_BO: + /* These negate each other. */ + return 0; + case XCT_OPENING: + case XCT_UNKNOWN_OP: + ++(*depth); + return 0; + case XCT_CLOSING: + case XCT_UNKNOWN_CL: + if(--(*depth) == 0) + return (tcv == XCT_CLOSING) ? 2 : 1; + return 0; + default: + return -1; + } +} diff --git a/src/codec_utils/E2SMKPM/xer_decoder.h b/src/codec_utils/E2SMKPM/xer_decoder.h new file mode 100644 index 000000000..b951c41d1 --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_decoder.h @@ -0,0 +1,106 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_DECODER_H_ +#define _XER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The XER decoder of any ASN.1 type. May be invoked by the application. + * Decodes CANONICAL-XER and BASIC-XER. + */ +asn_dec_rval_t xer_decode( + const struct asn_codec_ctx_s *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ +); + +/* + * Type of the type-specific XER decoder function. + */ +typedef asn_dec_rval_t(xer_type_decoder_f)( + const asn_codec_ctx_t *opt_codec_ctx, + const struct asn_TYPE_descriptor_s *type_descriptor, void **struct_ptr, + const char *opt_mname, /* Member name */ + const void *buf_ptr, size_t size); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Generalized function for decoding the primitive values. + * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 + * and others. This function should not be used by applications, as its API + * is subject to changes. + */ +asn_dec_rval_t xer_decode_general( + const asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, /* Treated as opaque pointer */ + const char *xml_tag, /* Expected XML tag name */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder)(void *struct_key, const void *chunk_buf, + size_t chunk_size), + ssize_t (*body_receiver)(void *struct_key, const void *chunk_buf, + size_t chunk_size, int have_more)); + + +/* + * Fetch the next XER (XML) token from the stream. + * The function returns the number of bytes occupied by the chunk type, + * returned in the _ch_type. The _ch_type is only set (and valid) when + * the return value is >= 0. + */ + typedef enum pxer_chunk_type { + PXER_WMORE, /* Chunk type is not clear, more data expected. */ + PXER_TAG, /* Complete XER tag */ + PXER_TEXT, /* Plain text between XER tags */ + PXER_COMMENT /* A comment, may be part of */ + } pxer_chunk_type_e; +ssize_t xer_next_token(int *stateContext, + const void *buffer, size_t size, pxer_chunk_type_e *_ch_type); + +/* + * This function checks the buffer against the tag name is expected to occur. + */ + typedef enum xer_check_tag { + XCT_BROKEN = 0, /* The tag is broken */ + XCT_OPENING = 1, /* This is the tag */ + XCT_CLOSING = 2, /* This is the tag */ + XCT_BOTH = 3, /* This is the tag */ + XCT__UNK__MASK = 4, /* Mask of everything unexpected */ + XCT_UNKNOWN_OP = 5, /* Unexpected tag */ + XCT_UNKNOWN_CL = 6, /* Unexpected tag */ + XCT_UNKNOWN_BO = 7 /* Unexpected tag */ + } xer_check_tag_e; +xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, + const char *need_tag); + +/* + * Get the number of bytes consisting entirely of XER whitespace characters. + * RETURN VALUES: + * >=0: Number of whitespace characters in the string. + */ +size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size); + +/* + * Skip the series of anticipated extensions. + */ +int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_DECODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/xer_encoder.c b/src/codec_utils/E2SMKPM/xer_encoder.c new file mode 100644 index 000000000..4177ede5c --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_encoder.c @@ -0,0 +1,237 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +xer_encode(const asn_TYPE_descriptor_t *td, const void *sptr, + enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0, 0, 0}; + asn_enc_rval_t tmper; + const char *mname; + size_t mlen; + int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; + + if(!td || !sptr) goto cb_failed; + + mname = td->xml_tag; + mlen = strlen(mname); + + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = td->op->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("\n", xcan); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +/* + * This is a helper function for xer_fprint, which directs all incoming data + * into the provided file descriptor. + */ +static int +xer__print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + +int +xer_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, const void *sptr) { + asn_enc_rval_t er = {0,0,0}; + + if(!stream) stream = stdout; + if(!td || !sptr) + return -1; + + er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} + +struct xer_buffer { + char *buffer; + size_t buffer_size; + size_t allocated_size; +}; + +static int +xer__buffer_append(const void *buffer, size_t size, void *app_key) { + struct xer_buffer *xb = app_key; + + while(xb->buffer_size + size + 1 > xb->allocated_size) { + size_t new_size = 2 * (xb->allocated_size ? xb->allocated_size : 64); + char *new_buf = MALLOC(new_size); + if(!new_buf) return -1; + if (xb->buffer) { + memcpy(new_buf, xb->buffer, xb->buffer_size); + } + FREEMEM(xb->buffer); + xb->buffer = new_buf; + xb->allocated_size = new_size; + } + + memcpy(xb->buffer + xb->buffer_size, buffer, size); + xb->buffer_size += size; + xb->buffer[xb->buffer_size] = '\0'; + return 0; +} + +enum xer_equivalence_e +xer_equivalent(const struct asn_TYPE_descriptor_s *td, const void *struct1, + const void *struct2, FILE *opt_debug_stream) { + struct xer_buffer xb1 = {0, 0, 0}; + struct xer_buffer xb2 = {0, 0, 0}; + asn_enc_rval_t e1, e2; + asn_dec_rval_t rval; + void *sptr = NULL; + + if(!td || !struct1 || !struct2) { + if(opt_debug_stream) { + if(!td) fprintf(opt_debug_stream, "Type descriptor missing\n"); + if(!struct1) fprintf(opt_debug_stream, "Structure 1 missing\n"); + if(!struct2) fprintf(opt_debug_stream, "Structure 2 missing\n"); + } + return XEQ_FAILURE; + } + + e1 = xer_encode(td, struct1, XER_F_BASIC, xer__buffer_append, &xb1); + if(e1.encoded == -1) { + if(opt_debug_stream) { + fprintf(stderr, "XER Encoding of %s failed\n", td->name); + } + FREEMEM(xb1.buffer); + return XEQ_ENCODE1_FAILED; + } + + e2 = xer_encode(td, struct2, XER_F_BASIC, xer__buffer_append, &xb2); + if(e2.encoded == -1) { + if(opt_debug_stream) { + fprintf(stderr, "XER Encoding of %s failed\n", td->name); + } + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_ENCODE1_FAILED; + } + + if(xb1.buffer_size != xb2.buffer_size + || memcmp(xb1.buffer, xb2.buffer, xb1.buffer_size) != 0) { + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "Structures XER-encoded into different byte streams:\n=== " + "Structure 1 ===\n%s\n=== Structure 2 ===\n%s\n", + xb1.buffer, xb2.buffer); + } + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_DIFFERENT; + } else { + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "Both structures encoded into the same XER byte stream " + "of size %" ASN_PRI_SIZE ":\n%s", + xb1.buffer_size, xb1.buffer); + } + } + + rval = xer_decode(NULL, td, (void **)&sptr, xb1.buffer, + xb1.buffer_size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "Structure %s XER decode unexpectedly requires " + "more data:\n%s\n", + td->name, xb1.buffer); + } + /* Fall through */ + case RC_FAIL: + default: + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "Structure %s XER decoding resulted in failure.\n", + td->name); + } + ASN_STRUCT_FREE(*td, sptr); + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_DECODE_FAILED; + } + + if(rval.consumed != xb1.buffer_size + && ((rval.consumed > xb1.buffer_size) + || xer_whitespace_span(xb1.buffer + rval.consumed, + xb1.buffer_size - rval.consumed) + != (xb1.buffer_size - rval.consumed))) { + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "Round-trip decode of %s required less bytes (%" ASN_PRI_SIZE ") than " + "encoded (%" ASN_PRI_SIZE ")\n", + td->name, rval.consumed, xb1.buffer_size); + } + ASN_STRUCT_FREE(*td, sptr); + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_ROUND_TRIP_FAILED; + } + + /* + * Reuse xb2 to encode newly decoded structure. + */ + FREEMEM(xb2.buffer); + memset(&xb2, 0, sizeof(xb2)); + + e2 = xer_encode(td, sptr, XER_F_BASIC, xer__buffer_append, &xb2); + if(e2.encoded == -1) { + if(opt_debug_stream) { + fprintf(stderr, "XER Encoding of round-trip decode of %s failed\n", + td->name); + } + ASN_STRUCT_FREE(*td, sptr); + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_ROUND_TRIP_FAILED; + } + + ASN_STRUCT_FREE(*td, sptr); + sptr = 0; + + if(xb1.buffer_size != xb2.buffer_size + || memcmp(xb1.buffer, xb2.buffer, xb1.buffer_size) != 0) { + if(opt_debug_stream) { + fprintf(opt_debug_stream, + "XER Encoding of round-trip decode of %s resulted in " + "different byte stream:\n" + "=== Original ===\n%s\n" + "=== Round-tripped ===\n%s\n", + xb1.buffer, xb2.buffer, td->name); + } + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_ROUND_TRIP_FAILED; + } + + FREEMEM(xb1.buffer); + FREEMEM(xb2.buffer); + return XEQ_SUCCESS; +} + diff --git a/src/codec_utils/E2SMKPM/xer_encoder.h b/src/codec_utils/E2SMKPM/xer_encoder.h new file mode 100644 index 000000000..9d75922c5 --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_encoder.h @@ -0,0 +1,83 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_ENCODER_H_ +#define _XER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ +enum xer_encoder_flags_e { + /* Mode of encoding */ + XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ + XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules) */ +}; + +/* + * The XER encoder of any type. May be invoked by the application. + * Produces CANONICAL-XER and BASIC-XER depending on the (xer_flags). + */ +asn_enc_rval_t xer_encode(const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ +); + +/* + * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) + * output into the chosen file pointer. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem printing the structure. + * WARNING: No sensible errno value is returned. + */ +int xer_fprint(FILE *stream, const struct asn_TYPE_descriptor_s *td, + const void *struct_ptr); + +/* + * A helper function that uses XER encoding/decoding to verify that: + * - Both structures encode into the same BASIC XER. + * - Both resulting XER byte streams can be decoded back. + * - Both decoded structures encode into the same BASIC XER (round-trip). + * All of this verifies equivalence between structures and a round-trip. + * ARGUMENTS: + * (opt_debug_stream) - If specified, prints ongoing details. + */ +enum xer_equivalence_e { + XEQ_SUCCESS, /* The only completely positive return value */ + XEQ_FAILURE, /* General failure */ + XEQ_ENCODE1_FAILED, /* First sructure XER encoding failed */ + XEQ_ENCODE2_FAILED, /* Second structure XER encoding failed */ + XEQ_DIFFERENT, /* Structures encoded into different XER */ + XEQ_DECODE_FAILED, /* Decode of the XER data failed */ + XEQ_ROUND_TRIP_FAILED /* Bad round-trip */ +}; +enum xer_equivalence_e xer_equivalent( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct1, + const void *struct2, FILE *opt_debug_stream); + +/* + * Type of the generic XER encoder. + */ +typedef asn_enc_rval_t(xer_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Structure to be encoded */ + int ilevel, /* Level of indentation */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ +); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_ENCODER_H_ */ diff --git a/src/codec_utils/E2SMKPM/xer_support.c b/src/codec_utils/E2SMKPM/xer_support.c new file mode 100644 index 000000000..36b4bfbfc --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_support.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* Parser states */ +typedef enum { + ST_TEXT, + ST_TAG_START, + ST_TAG_BODY, + ST_TAG_QUOTE_WAIT, + ST_TAG_QUOTED_STRING, + ST_TAG_UNQUOTED_STRING, + ST_COMMENT_WAIT_DASH1, /* ""[0] */ + ST_COMMENT_CLO_RT /* "-->"[1] */ +} pstate_e; + +static const int +_charclass[256] = { + 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ +}; +#define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) +#define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) +#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) + +/* Aliases for characters, ASCII/UTF-8 */ +#define EXCLAM 0x21 /* '!' */ +#define CQUOTE 0x22 /* '"' */ +#define CDASH 0x2d /* '-' */ +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define CEQUAL 0x3d /* '=' */ +#define RANGLE 0x3e /* '>' */ +#define CQUEST 0x3f /* '?' */ + +/* Invoke token callback */ +#define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ + int _ret; \ + pstate_e ns = _ns; \ + ssize_t _sz = (p - chunk_start) + _current_too; \ + if (!_sz) { \ + /* Shortcut */ \ + state = _ns; \ + break; \ + } \ + _ret = cb(type, chunk_start, _sz, key); \ + if(_ret < _sz) { \ + if(_current_too && _ret == -1) \ + state = ns; \ + goto finish; \ + } \ + chunk_start = p + _current_too; \ + state = ns; \ + } while(0) + +#define TOKEN_CB(_type, _ns, _current_too) \ + TOKEN_CB_CALL(_type, _ns, _current_too, 0) + +#define PXML_TAG_FINAL_CHUNK_TYPE PXML_TAG_END +#define PXML_COMMENT_FINAL_CHUNK_TYPE PXML_COMMENT_END + +#define TOKEN_CB_FINAL(_type, _ns, _current_too) \ + TOKEN_CB_CALL( _type ## _FINAL_CHUNK_TYPE , _ns, _current_too, 1) + +/* + * Parser itself + */ +ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { + pstate_e state = (pstate_e)*stateContext; + const char *chunk_start = (const char *)xmlbuf; + const char *p = chunk_start; + const char *end = p + size; + + for(; p < end; p++) { + int C = *(const unsigned char *)p; + switch(state) { + case ST_TEXT: + /* + * Initial state: we're in the middle of some text, + * or just have started. + */ + if (C == LANGLE) + /* We're now in the tag, probably */ + TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); + break; + case ST_TAG_START: + if (ALPHA(C) || (C == CSLASH)) + state = ST_TAG_BODY; + else if (C == EXCLAM) + state = ST_COMMENT_WAIT_DASH1; + else + /* + * Not characters and not whitespace. + * Must be something like "3 < 4". + */ + TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ + break; + case ST_TAG_BODY: + switch(C) { + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + case LANGLE: + /* + * The previous tag wasn't completed, but still + * recognized as valid. (Mozilla-compatible) + */ + TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); + break; + case CEQUAL: + state = ST_TAG_QUOTE_WAIT; + break; + } + break; + case ST_TAG_QUOTE_WAIT: + /* + * State after the equal sign ("=") in the tag. + */ + switch(C) { + case CQUOTE: + state = ST_TAG_QUOTED_STRING; + break; + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + default: + if(!WHITESPACE(C)) + /* Unquoted string value */ + state = ST_TAG_UNQUOTED_STRING; + } + break; + case ST_TAG_QUOTED_STRING: + /* + * Tag attribute's string value in quotes. + */ + if(C == CQUOTE) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_TAG_UNQUOTED_STRING: + if(C == RANGLE) { + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + } else if(WHITESPACE(C)) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH1: + if(C == CDASH) { + state = ST_COMMENT_WAIT_DASH2; + } else { + /* Some ordinary tag. */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH2: + if(C == CDASH) { + /* Seen "<--" */ + state = ST_COMMENT; + } else { + /* Some ordinary tag */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT: + if(C == CDASH) { + state = ST_COMMENT_CLO_DASH2; + } + break; + case ST_COMMENT_CLO_DASH2: + if(C == CDASH) { + state = ST_COMMENT_CLO_RT; + } else { + /* This is not an end of a comment */ + state = ST_COMMENT; + } + break; + case ST_COMMENT_CLO_RT: + if(C == RANGLE) { + TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); + } else if(C == CDASH) { + /* Maintain current state, still waiting for '>' */ + } else { + state = ST_COMMENT; + } + break; + } /* switch(*ptr) */ + } /* for() */ + + /* + * Flush the partially processed chunk, state permitting. + */ + if(p - chunk_start) { + switch (state) { + case ST_COMMENT: + TOKEN_CB(PXML_COMMENT, state, 0); + break; + case ST_TEXT: + TOKEN_CB(PXML_TEXT, state, 0); + break; + default: break; /* a no-op */ + } + } + +finish: + *stateContext = (int)state; + return chunk_start - (const char *)xmlbuf; +} + diff --git a/src/codec_utils/E2SMKPM/xer_support.h b/src/codec_utils/E2SMKPM/xer_support.h new file mode 100644 index 000000000..c3a36e720 --- /dev/null +++ b/src/codec_utils/E2SMKPM/xer_support.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_SUPPORT_H_ +#define _XER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Types of data transferred to the application. + */ +typedef enum { + PXML_TEXT, /* Plain text between XML tags. */ + PXML_TAG, /* A tag, starting with '<'. */ + PXML_COMMENT, /* An XML comment, including "". */ + /* + * The following chunk types are reported if the chunk + * terminates the specified XML element. + */ + PXML_TAG_END, /* Tag ended */ + PXML_COMMENT_END /* Comment ended */ +} pxml_chunk_type_e; + +/* + * Callback function that is called by the parser when parsed data is + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text + * data is the piece of buffer identified by _bufid (as supplied to + * pxml_feed() call) starting at offset _offset and of _size bytes size. + * The chunk is NOT '\0'-terminated. + */ +typedef int (pxml_callback_f)(pxml_chunk_type_e _type, + const void *_chunk_data, size_t _chunk_size, void *_key); + +/* + * Parse the given buffer as it were a chunk of XML data. + * Invoke the specified callback each time the meaninful data is found. + * This function returns number of bytes consumed from the bufer. + * It will always be lesser than or equal to the specified _size. + * The next invocation of this function must account the difference. + */ +ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, + pxml_callback_f *cb, void *_key); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_SUPPORT_H_ */ diff --git a/src/du_app/du_e2ap_msg_hdl.c b/src/du_app/du_e2ap_msg_hdl.c index ce659bc84..57a89f900 100644 --- a/src/du_app/du_e2ap_msg_hdl.c +++ b/src/du_app/du_e2ap_msg_hdl.c @@ -28,6 +28,9 @@ #include "du_utils.h" #include "GlobalE2node-gNB-ID.h" #include +#include "E2setupRequest.h" +#include "InitiatingMessageE2.h" +#include "SuccessfulOutcomeE2.h" #include "E2AP-PDU.h" #include "du_e2ap_msg_hdl.h" #include "odu_common_codec.h" diff --git a/src/du_app/du_e2ap_msg_hdl.h b/src/du_app/du_e2ap_msg_hdl.h index a2521e39f..8c86edd50 100644 --- a/src/du_app/du_e2ap_msg_hdl.h +++ b/src/du_app/du_e2ap_msg_hdl.h @@ -18,6 +18,7 @@ /* This file contains all E2AP message handler related functionality */ +#include "E2setupRequest.h" #define ENCODE_FAIL -1 uint8_t sctpSend(Buffer *mBuf, uint8_t itfType); diff --git a/src/ric_stub/ric_e2ap_msg_hdl.c b/src/ric_stub/ric_e2ap_msg_hdl.c index 20b394841..e48ac4ea7 100644 --- a/src/ric_stub/ric_e2ap_msg_hdl.c +++ b/src/ric_stub/ric_e2ap_msg_hdl.c @@ -26,6 +26,8 @@ #include "ric_e2ap_msg_hdl.h" #include "GlobalE2node-gNB-ID.h" #include "ProtocolIE-FieldE2.h" +#include "InitiatingMessageE2.h" +#include "SuccessfulOutcomeE2.h" #include "E2AP-PDU.h" #include "du_log.h" -- 2.16.6

tj;eYOC729vC>Plmps3F70 zT=70ij3$3o8Ny94qev6Qv`!?m!rmI z&25(y_3jaVwx11w=&Z?;)DRb$O?y*Rs=gn&f?*bH6*r>8m|i7JLD*ydV<-B51bq5Yfflc#%+_73)byvr-H zHXBFD7#h#bcUs^~h+A^YT%v9NY1rkXWJq!RbetbxG+(d}+> z6DTVr7)MwL2NbmrVi+2goMAC!RMfmd4HHLg55sK<44OY^6E`SVuObf} zu|2!Cs(z;jmS-5W>j2(jxR}DbT)N9`rKrmh4eKEVfj{!Wjoey#Y3olZ>seX6Pa2Zs zTesc#Gf=a|ezMXr8>w+55|zz`b)yLTO%13;S=pB%g~v$Wq)%*D@XDsZG=PYQ%oUmu*C&sWzSk;cUx^L?g7BY&1tWt zxhngxi!sXz=dIG>vaEw=hz%iyowm=##>|8gdXi=ms%sf9eLF|4 zox%)acX7FRWuu>HDBhwl-UU}G%7!k0wxS~%qN(+xlbZHNFCnwXuXpX>`?Fn&gmLhD zheKKACKA~mtW0<7D}dQNc~=J#I9gA&zvdT2=`*GI%ZUI_D?_G|}19I~lUwVSNP6+{nu-Y8|rW z#jti6q$|b3Sha|BOeB>M9uC_9$Uss;X)#hH3$I%Aq(^ zWjLf1B$+@Yse56=rEOzdXqs)ijcYv9e4>L1MS-*#s~=nmQA?HHRQg%?gL{%7D$PmV z%E2&=n=-j{`3iAjXhFq&$rE%O7@5gWn}7!2OUxlc!^VQ3oh}M>35y_2Vyn=8B<~ki zuaX8;w?ju`AG#OmAg+_}q~Jos9+lSXZg!B9jYF9EEDdZ8w{mU^ctx%fiTUisc?1b}kBCC$c zD4cQ|8e$N1pE~!uw-Y~Mughq5l&vqIO~M?W?$Jv7L9uC)TQ^r#-UNB(ciDU2WXE=f zc`2d?D5ZXASG4pWtyprIh zGNj+)bTuQ$Fe=~>DtR(d8@*TyY%ybcs+iIQ0%xDKfRXsm-$sITLY9jE<6bkde_#3eJ`#v52M!6}Tr zQ)jQViX%0pMY?1d^Os01P!`M`F44}Xf|kH#s+-dIGw`J1qep7L5Ff}%%=1j|3-HPVaMpAYtN3M5&gwg z`7AN6q2K@X2*9A5(Z%=(5SlKqd3b_n0&Ku)PO|}XRNM#A{Qv)c7n=AL_;*E`x_xDv zzTK7wzbDW217ZE&AHa|A!9T5kaAg~QHO+xMxJtj$f4`c((zi|c-`8JU*{0_UssD%c zEB%+(zYj&f{Px?a_W#+HZ36yG9=t`rn&vh6{JwnZ$3A@db@-?CzqqmuznbO?dGLvR zeixo0?OOj01cJXG!@uvqKdt}pwQcy-G!Lc2*D{7>Kbt=R*l!*F``_Kh>diiO2!FTu z!|>OB^z#Ljf8*+ZBK1F!`rA@J$6p>dKY=gEQ*H0(Qvc^t|Dgcp{8Re>Lh9cWxYxh8 zP2XO}L507!q+zU&b#ngwH9SL}NO#TcU)zRX4Sdo^^Co}T|A?#q`z!e2>whTqKa~1^ zo-zD&sjQ!$X7#`P!8SpB`2z-2eEC`lf`_(6Z2VZ>s zPrulqqEElzdP0VR(^%OL`11Gg59{mreJ=Gsm-?Umn}=?itMO;^5AfU9zx~tu1abSP z%;|snome5~|37E-zy2B5|N3VP`N!|a`Z+)U1&V(Y{wbGU|K^w~y#5W>&*Agm{|eB* zt{(nGSq+k2LD)q0fS^qzwF3PUfe@p7WCG~%Sjl-YHx8kpI@EMf({=fc~ z>HqrMVfwY5|IX?+O^4mVA8YI{_=o+k_4M;=DDnM&DfPdU`Vap|2#^-8T1))p8~DJs zl>Y4>o>0MCKV*u(Vleyvs(s@x-+|__hiln$t$#CnuGr}3Z$r8E?LpuCA2vY0p@34D u{iMECcYOU11^>_gouB?beEcPlq. All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_ENCODER_H_ +#define _PER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) + */ +asn_enc_rval_t uper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +asn_enc_rval_t aper_encode( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ +asn_enc_rval_t uper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); + +asn_enc_rval_t aper_encode_to_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-packing + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, + const void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); + +ssize_t +aper_encode_to_new_buffer( + const struct asn_TYPE_descriptor_s *td, + const asn_per_constraints_t *constraints, + const void *sptr, + void **buffer_r +); + +/* + * Type of the generic PER encoder function. + */ +typedef asn_enc_rval_t(per_type_encoder_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const asn_per_constraints_t *constraints, const void *struct_ptr, + asn_per_outp_t *per_output); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_ENCODER_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/CauseE2.c b/src/codec_utils/E2AP_OLD1/CauseE2.c new file mode 100644 index 000000000..4d39d1f26 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseE2.c @@ -0,0 +1,95 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseE2.h" + +static asn_oer_constraints_t asn_OER_type_CauseE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 4 } /* (0..4,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_CauseE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.ricRequest), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseRIC, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.ricService), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseRICservice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricService" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.transport), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseTransport, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "transport" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.protocol), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseProtocol, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocol" + }, + { ATF_NOFLAGS, 0, offsetof(struct CauseE2, choice.misc), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CauseMisc, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "misc" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_CauseE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* misc */ +}; +asn_CHOICE_specifics_t asn_SPC_CauseE2_specs_1 = { + sizeof(struct CauseE2), + offsetof(struct CauseE2, _asn_ctx), + offsetof(struct CauseE2, present), + sizeof(((struct CauseE2 *)0)->present), + asn_MAP_CauseE2_tag2el_1, + 5, /* Count of tags in the map */ + 0, 0, + 5 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_CauseE2 = { + "CauseE2", + "CauseE2", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_CauseE2_constr_1, &asn_PER_type_CauseE2_constr_1, CHOICE_constraint }, + asn_MBR_CauseE2_1, + 5, /* Elements count */ + &asn_SPC_CauseE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseE2.h b/src/codec_utils/E2AP_OLD1/CauseE2.h new file mode 100644 index 000000000..1298a7f97 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseE2.h @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseE2_H_ +#define _CauseE2_H_ + + +#include + +/* Including external dependencies */ +#include "CauseRIC.h" +#include "CauseRICservice.h" +#include "CauseTransport.h" +#include "CauseProtocol.h" +#include "CauseMisc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseE2_PR { + CauseE2_PR_NOTHING, /* No components present */ + CauseE2_PR_ricRequest, + CauseE2_PR_ricService, + CauseE2_PR_transport, + CauseE2_PR_protocol, + CauseE2_PR_misc + /* Extensions may appear below */ + +} CauseE2_PR; + +/* CauseE2 */ +typedef struct CauseE2 { + CauseE2_PR present; + union CauseE2_u { + CauseRIC_t ricRequest; + CauseRICservice_t ricService; + CauseTransport_t transport; + CauseProtocol_t protocol; + CauseMisc_t misc; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CauseE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CauseE2; +extern asn_CHOICE_specifics_t asn_SPC_CauseE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CauseE2_1[5]; +extern asn_per_constraints_t asn_PER_type_CauseE2_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CauseMisc.c b/src/codec_utils/E2AP_OLD1/CauseMisc.c new file mode 100644 index 000000000..2cc334e5d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseMisc.c @@ -0,0 +1,62 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseMisc.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseMisc_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseMisc_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseMisc_value2enum_1[] = { + { 0, 27, "control-processing-overload" }, + { 1, 16, "hardware-failure" }, + { 2, 15, "om-intervention" }, + { 3, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseMisc_enum2value_1[] = { + 0, /* control-processing-overload(0) */ + 1, /* hardware-failure(1) */ + 2, /* om-intervention(2) */ + 3 /* unspecified(3) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1 = { + asn_MAP_CauseMisc_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseMisc_enum2value_1, /* N => "tag"; sorted by N */ + 4, /* Number of elements in the maps */ + 5, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseMisc_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseMisc = { + "CauseMisc", + "CauseMisc", + &asn_OP_NativeEnumerated, + asn_DEF_CauseMisc_tags_1, + sizeof(asn_DEF_CauseMisc_tags_1) + /sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */ + asn_DEF_CauseMisc_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseMisc_tags_1) + /sizeof(asn_DEF_CauseMisc_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseMisc_constr_1, &asn_PER_type_CauseMisc_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseMisc_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseMisc.h b/src/codec_utils/E2AP_OLD1/CauseMisc.h new file mode 100644 index 000000000..bd8c78463 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseMisc.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseMisc_H_ +#define _CauseMisc_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseMisc { + CauseMisc_control_processing_overload = 0, + CauseMisc_hardware_failure = 1, + CauseMisc_om_intervention = 2, + CauseMisc_unspecified = 3 + /* + * Enumeration is extensible + */ +} e_CauseMisc; + +/* CauseMisc */ +typedef long CauseMisc_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseMisc_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseMisc; +extern const asn_INTEGER_specifics_t asn_SPC_CauseMisc_specs_1; +asn_struct_free_f CauseMisc_free; +asn_struct_print_f CauseMisc_print; +asn_constr_check_f CauseMisc_constraint; +ber_type_decoder_f CauseMisc_decode_ber; +der_type_encoder_f CauseMisc_encode_der; +xer_type_decoder_f CauseMisc_decode_xer; +xer_type_encoder_f CauseMisc_encode_xer; +oer_type_decoder_f CauseMisc_decode_oer; +oer_type_encoder_f CauseMisc_encode_oer; +per_type_decoder_f CauseMisc_decode_uper; +per_type_encoder_f CauseMisc_encode_uper; +per_type_decoder_f CauseMisc_decode_aper; +per_type_encoder_f CauseMisc_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseMisc_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CauseProtocol.c b/src/codec_utils/E2AP_OLD1/CauseProtocol.c new file mode 100644 index 000000000..6f9fa4123 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseProtocol.c @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseProtocol.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseProtocol_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 6 } /* (0..6,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseProtocol_value2enum_1[] = { + { 0, 21, "transfer-syntax-error" }, + { 1, 28, "abstract-syntax-error-reject" }, + { 2, 39, "abstract-syntax-error-ignore-and-notify" }, + { 3, 42, "message-not-compatible-with-receiver-state" }, + { 4, 14, "semantic-error" }, + { 5, 49, "abstract-syntax-error-falsely-constructed-message" }, + { 6, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseProtocol_enum2value_1[] = { + 5, /* abstract-syntax-error-falsely-constructed-message(5) */ + 2, /* abstract-syntax-error-ignore-and-notify(2) */ + 1, /* abstract-syntax-error-reject(1) */ + 3, /* message-not-compatible-with-receiver-state(3) */ + 4, /* semantic-error(4) */ + 0, /* transfer-syntax-error(0) */ + 6 /* unspecified(6) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1 = { + asn_MAP_CauseProtocol_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseProtocol_enum2value_1, /* N => "tag"; sorted by N */ + 7, /* Number of elements in the maps */ + 8, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseProtocol_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseProtocol = { + "CauseProtocol", + "CauseProtocol", + &asn_OP_NativeEnumerated, + asn_DEF_CauseProtocol_tags_1, + sizeof(asn_DEF_CauseProtocol_tags_1) + /sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */ + asn_DEF_CauseProtocol_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseProtocol_tags_1) + /sizeof(asn_DEF_CauseProtocol_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseProtocol_constr_1, &asn_PER_type_CauseProtocol_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseProtocol_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseProtocol.h b/src/codec_utils/E2AP_OLD1/CauseProtocol.h new file mode 100644 index 000000000..75083ab9b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseProtocol.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseProtocol_H_ +#define _CauseProtocol_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseProtocol { + CauseProtocol_transfer_syntax_error = 0, + CauseProtocol_abstract_syntax_error_reject = 1, + CauseProtocol_abstract_syntax_error_ignore_and_notify = 2, + CauseProtocol_message_not_compatible_with_receiver_state = 3, + CauseProtocol_semantic_error = 4, + CauseProtocol_abstract_syntax_error_falsely_constructed_message = 5, + CauseProtocol_unspecified = 6 + /* + * Enumeration is extensible + */ +} e_CauseProtocol; + +/* CauseProtocol */ +typedef long CauseProtocol_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseProtocol_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseProtocol; +extern const asn_INTEGER_specifics_t asn_SPC_CauseProtocol_specs_1; +asn_struct_free_f CauseProtocol_free; +asn_struct_print_f CauseProtocol_print; +asn_constr_check_f CauseProtocol_constraint; +ber_type_decoder_f CauseProtocol_decode_ber; +der_type_encoder_f CauseProtocol_encode_der; +xer_type_decoder_f CauseProtocol_decode_xer; +xer_type_encoder_f CauseProtocol_encode_xer; +oer_type_decoder_f CauseProtocol_decode_oer; +oer_type_encoder_f CauseProtocol_encode_oer; +per_type_decoder_f CauseProtocol_decode_uper; +per_type_encoder_f CauseProtocol_encode_uper; +per_type_decoder_f CauseProtocol_decode_aper; +per_type_encoder_f CauseProtocol_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseProtocol_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CauseRIC.c b/src/codec_utils/E2AP_OLD1/CauseRIC.c new file mode 100644 index 000000000..18e644e92 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseRIC.c @@ -0,0 +1,76 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseRIC.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseRIC_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseRIC_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 4, 4, 0, 10 } /* (0..10,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseRIC_value2enum_1[] = { + { 0, 23, "ran-function-id-Invalid" }, + { 1, 20, "action-not-supported" }, + { 2, 17, "excessive-actions" }, + { 3, 16, "duplicate-action" }, + { 4, 15, "duplicate-event" }, + { 5, 23, "function-resource-limit" }, + { 6, 18, "request-id-unknown" }, + { 7, 46, "inconsistent-action-subsequent-action-sequence" }, + { 8, 23, "control-message-invalid" }, + { 9, 23, "call-process-id-invalid" }, + { 10, 11, "unspecified" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseRIC_enum2value_1[] = { + 1, /* action-not-supported(1) */ + 9, /* call-process-id-invalid(9) */ + 8, /* control-message-invalid(8) */ + 3, /* duplicate-action(3) */ + 4, /* duplicate-event(4) */ + 2, /* excessive-actions(2) */ + 5, /* function-resource-limit(5) */ + 7, /* inconsistent-action-subsequent-action-sequence(7) */ + 0, /* ran-function-id-Invalid(0) */ + 6, /* request-id-unknown(6) */ + 10 /* unspecified(10) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1 = { + asn_MAP_CauseRIC_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseRIC_enum2value_1, /* N => "tag"; sorted by N */ + 11, /* Number of elements in the maps */ + 12, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseRIC_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseRIC = { + "CauseRIC", + "CauseRIC", + &asn_OP_NativeEnumerated, + asn_DEF_CauseRIC_tags_1, + sizeof(asn_DEF_CauseRIC_tags_1) + /sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */ + asn_DEF_CauseRIC_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseRIC_tags_1) + /sizeof(asn_DEF_CauseRIC_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseRIC_constr_1, &asn_PER_type_CauseRIC_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseRIC_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseRIC.h b/src/codec_utils/E2AP_OLD1/CauseRIC.h new file mode 100644 index 000000000..b4925f308 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseRIC.h @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseRIC_H_ +#define _CauseRIC_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseRIC { + CauseRIC_ran_function_id_Invalid = 0, + CauseRIC_action_not_supported = 1, + CauseRIC_excessive_actions = 2, + CauseRIC_duplicate_action = 3, + CauseRIC_duplicate_event = 4, + CauseRIC_function_resource_limit = 5, + CauseRIC_request_id_unknown = 6, + CauseRIC_inconsistent_action_subsequent_action_sequence = 7, + CauseRIC_control_message_invalid = 8, + CauseRIC_call_process_id_invalid = 9, + CauseRIC_unspecified = 10 + /* + * Enumeration is extensible + */ +} e_CauseRIC; + +/* CauseRIC */ +typedef long CauseRIC_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseRIC_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseRIC; +extern const asn_INTEGER_specifics_t asn_SPC_CauseRIC_specs_1; +asn_struct_free_f CauseRIC_free; +asn_struct_print_f CauseRIC_print; +asn_constr_check_f CauseRIC_constraint; +ber_type_decoder_f CauseRIC_decode_ber; +der_type_encoder_f CauseRIC_encode_der; +xer_type_decoder_f CauseRIC_decode_xer; +xer_type_encoder_f CauseRIC_encode_xer; +oer_type_decoder_f CauseRIC_decode_oer; +oer_type_encoder_f CauseRIC_encode_oer; +per_type_decoder_f CauseRIC_decode_uper; +per_type_encoder_f CauseRIC_encode_uper; +per_type_decoder_f CauseRIC_decode_aper; +per_type_encoder_f CauseRIC_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseRIC_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CauseRICservice.c b/src/codec_utils/E2AP_OLD1/CauseRICservice.c new file mode 100644 index 000000000..2846bfefb --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseRICservice.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseRICservice.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseRICservice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseRICservice_value2enum_1[] = { + { 0, 21, "function-not-required" }, + { 1, 19, "excessive-functions" }, + { 2, 18, "ric-resource-limit" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseRICservice_enum2value_1[] = { + 1, /* excessive-functions(1) */ + 0, /* function-not-required(0) */ + 2 /* ric-resource-limit(2) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1 = { + asn_MAP_CauseRICservice_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseRICservice_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseRICservice_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseRICservice = { + "CauseRICservice", + "CauseRICservice", + &asn_OP_NativeEnumerated, + asn_DEF_CauseRICservice_tags_1, + sizeof(asn_DEF_CauseRICservice_tags_1) + /sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */ + asn_DEF_CauseRICservice_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseRICservice_tags_1) + /sizeof(asn_DEF_CauseRICservice_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseRICservice_constr_1, &asn_PER_type_CauseRICservice_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseRICservice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseRICservice.h b/src/codec_utils/E2AP_OLD1/CauseRICservice.h new file mode 100644 index 000000000..cc6db2d18 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseRICservice.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseRICservice_H_ +#define _CauseRICservice_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseRICservice { + CauseRICservice_function_not_required = 0, + CauseRICservice_excessive_functions = 1, + CauseRICservice_ric_resource_limit = 2 + /* + * Enumeration is extensible + */ +} e_CauseRICservice; + +/* CauseRICservice */ +typedef long CauseRICservice_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseRICservice_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseRICservice; +extern const asn_INTEGER_specifics_t asn_SPC_CauseRICservice_specs_1; +asn_struct_free_f CauseRICservice_free; +asn_struct_print_f CauseRICservice_print; +asn_constr_check_f CauseRICservice_constraint; +ber_type_decoder_f CauseRICservice_decode_ber; +der_type_encoder_f CauseRICservice_encode_der; +xer_type_decoder_f CauseRICservice_decode_xer; +xer_type_encoder_f CauseRICservice_encode_xer; +oer_type_decoder_f CauseRICservice_decode_oer; +oer_type_encoder_f CauseRICservice_encode_oer; +per_type_decoder_f CauseRICservice_decode_uper; +per_type_encoder_f CauseRICservice_encode_uper; +per_type_decoder_f CauseRICservice_decode_aper; +per_type_encoder_f CauseRICservice_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseRICservice_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CauseTransport.c b/src/codec_utils/E2AP_OLD1/CauseTransport.c new file mode 100644 index 000000000..6189c270c --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseTransport.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CauseTransport.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CauseTransport_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CauseTransport_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CauseTransport_value2enum_1[] = { + { 0, 11, "unspecified" }, + { 1, 30, "transport-resource-unavailable" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_CauseTransport_enum2value_1[] = { + 1, /* transport-resource-unavailable(1) */ + 0 /* unspecified(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1 = { + asn_MAP_CauseTransport_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CauseTransport_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CauseTransport_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CauseTransport = { + "CauseTransport", + "CauseTransport", + &asn_OP_NativeEnumerated, + asn_DEF_CauseTransport_tags_1, + sizeof(asn_DEF_CauseTransport_tags_1) + /sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */ + asn_DEF_CauseTransport_tags_1, /* Same as above */ + sizeof(asn_DEF_CauseTransport_tags_1) + /sizeof(asn_DEF_CauseTransport_tags_1[0]), /* 1 */ + { &asn_OER_type_CauseTransport_constr_1, &asn_PER_type_CauseTransport_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CauseTransport_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CauseTransport.h b/src/codec_utils/E2AP_OLD1/CauseTransport.h new file mode 100644 index 000000000..ec4550d12 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CauseTransport.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CauseTransport_H_ +#define _CauseTransport_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CauseTransport { + CauseTransport_unspecified = 0, + CauseTransport_transport_resource_unavailable = 1 + /* + * Enumeration is extensible + */ +} e_CauseTransport; + +/* CauseTransport */ +typedef long CauseTransport_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CauseTransport_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CauseTransport; +extern const asn_INTEGER_specifics_t asn_SPC_CauseTransport_specs_1; +asn_struct_free_f CauseTransport_free; +asn_struct_print_f CauseTransport_print; +asn_constr_check_f CauseTransport_constraint; +ber_type_decoder_f CauseTransport_decode_ber; +der_type_encoder_f CauseTransport_encode_der; +xer_type_decoder_f CauseTransport_decode_xer; +xer_type_encoder_f CauseTransport_encode_xer; +oer_type_decoder_f CauseTransport_decode_oer; +oer_type_encoder_f CauseTransport_encode_oer; +per_type_decoder_f CauseTransport_decode_uper; +per_type_encoder_f CauseTransport_encode_uper; +per_type_decoder_f CauseTransport_decode_aper; +per_type_encoder_f CauseTransport_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CauseTransport_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.c b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.c new file mode 100644 index 000000000..2c8702565 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnostics-IE-ItemE2.h" + +asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ItemE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, iECriticalityE2), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iECriticalityE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, iE_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iE-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_ItemE2, typeOfError), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TypeOfErrorE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "typeOfError" + }, +}; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_IE_ItemE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticalityE2 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* typeOfError */ +}; +asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1 = { + sizeof(struct CriticalityDiagnostics_IE_ItemE2), + offsetof(struct CriticalityDiagnostics_IE_ItemE2, _asn_ctx), + asn_MAP_CriticalityDiagnostics_IE_ItemE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ItemE2 = { + "CriticalityDiagnostics-IE-ItemE2", + "CriticalityDiagnostics-IE-ItemE2", + &asn_OP_SEQUENCE, + asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ItemE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CriticalityDiagnostics_IE_ItemE2_1, + 3, /* Elements count */ + &asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.h b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.h new file mode 100644 index 000000000..701fc31ef --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ItemE2.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnostics_IE_ItemE2_H_ +#define _CriticalityDiagnostics_IE_ItemE2_H_ + + +#include + +/* Including external dependencies */ +#include "CriticalityE2.h" +#include "ProtocolIE-IDE2.h" +#include "TypeOfErrorE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* CriticalityDiagnostics-IE-ItemE2 */ +typedef struct CriticalityDiagnostics_IE_ItemE2 { + CriticalityE2_t iECriticalityE2; + ProtocolIE_IDE2_t iE_ID; + TypeOfErrorE2_t typeOfError; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnostics_IE_ItemE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ItemE2; +extern asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_ItemE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ItemE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnostics_IE_ItemE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.c b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.c new file mode 100644 index 000000000..c548688e7 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnostics-IE-ListE2.h" + +#include "CriticalityDiagnostics-IE-ItemE2.h" +static asn_oer_constraints_t asn_OER_type_CriticalityDiagnostics_IE_ListE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..256)) */}; +asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 8, 8, 1, 256 } /* (SIZE(1..256)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ListE2_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnostics_IE_ItemE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1 = { + sizeof(struct CriticalityDiagnostics_IE_ListE2), + offsetof(struct CriticalityDiagnostics_IE_ListE2, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ListE2 = { + "CriticalityDiagnostics-IE-ListE2", + "CriticalityDiagnostics-IE-ListE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnostics_IE_ListE2_tags_1[0]), /* 1 */ + { &asn_OER_type_CriticalityDiagnostics_IE_ListE2_constr_1, &asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_CriticalityDiagnostics_IE_ListE2_1, + 1, /* Single element */ + &asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.h b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.h new file mode 100644 index 000000000..6c0424df9 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnostics-IE-ListE2.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnostics_IE_ListE2_H_ +#define _CriticalityDiagnostics_IE_ListE2_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct CriticalityDiagnostics_IE_ItemE2; + +/* CriticalityDiagnostics-IE-ListE2 */ +typedef struct CriticalityDiagnostics_IE_ListE2 { + A_SEQUENCE_OF(struct CriticalityDiagnostics_IE_ItemE2) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnostics_IE_ListE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_ListE2; +extern asn_SET_OF_specifics_t asn_SPC_CriticalityDiagnostics_IE_ListE2_specs_1; +extern asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_ListE2_1[1]; +extern asn_per_constraints_t asn_PER_type_CriticalityDiagnostics_IE_ListE2_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnostics_IE_ListE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.c b/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.c new file mode 100644 index 000000000..67cee5133 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityDiagnosticsE2.h" + +#include "RICrequestID.h" +#include "CriticalityDiagnostics-IE-ListE2.h" +static asn_TYPE_member_t asn_MBR_CriticalityDiagnosticsE2_1[] = { + { ATF_POINTER, 5, offsetof(struct CriticalityDiagnosticsE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_POINTER, 4, offsetof(struct CriticalityDiagnosticsE2, triggeringMessage), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_TriggeringMessageE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "triggeringMessage" + }, + { ATF_POINTER, 3, offsetof(struct CriticalityDiagnosticsE2, procedureCriticality), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "procedureCriticality" + }, + { ATF_POINTER, 2, offsetof(struct CriticalityDiagnosticsE2, ricRequestorID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricRequestorID" + }, + { ATF_POINTER, 1, offsetof(struct CriticalityDiagnosticsE2, iEsCriticalityDiagnosticsE2), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityDiagnostics_IE_ListE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "iEsCriticalityDiagnosticsE2" + }, +}; +static const int asn_MAP_CriticalityDiagnosticsE2_oms_1[] = { 0, 1, 2, 3, 4 }; +static const ber_tlv_tag_t asn_DEF_CriticalityDiagnosticsE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnosticsE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* ricRequestorID */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iEsCriticalityDiagnosticsE2 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnosticsE2_specs_1 = { + sizeof(struct CriticalityDiagnosticsE2), + offsetof(struct CriticalityDiagnosticsE2, _asn_ctx), + asn_MAP_CriticalityDiagnosticsE2_tag2el_1, + 5, /* Count of tags in the map */ + asn_MAP_CriticalityDiagnosticsE2_oms_1, /* Optional members */ + 5, 0, /* Root/Additions */ + 5, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnosticsE2 = { + "CriticalityDiagnosticsE2", + "CriticalityDiagnosticsE2", + &asn_OP_SEQUENCE, + asn_DEF_CriticalityDiagnosticsE2_tags_1, + sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityDiagnosticsE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1) + /sizeof(asn_DEF_CriticalityDiagnosticsE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_CriticalityDiagnosticsE2_1, + 5, /* Elements count */ + &asn_SPC_CriticalityDiagnosticsE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.h b/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.h new file mode 100644 index 000000000..4cba2c711 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityDiagnosticsE2.h @@ -0,0 +1,52 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityDiagnosticsE2_H_ +#define _CriticalityDiagnosticsE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "TriggeringMessageE2.h" +#include "CriticalityE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICrequestID; +struct CriticalityDiagnostics_IE_ListE2; + +/* CriticalityDiagnosticsE2 */ +typedef struct CriticalityDiagnosticsE2 { + ProcedureCodeE2_t *procedureCode; /* OPTIONAL */ + TriggeringMessageE2_t *triggeringMessage; /* OPTIONAL */ + CriticalityE2_t *procedureCriticality; /* OPTIONAL */ + struct RICrequestID *ricRequestorID; /* OPTIONAL */ + struct CriticalityDiagnostics_IE_ListE2 *iEsCriticalityDiagnosticsE2; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CriticalityDiagnosticsE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnosticsE2; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityDiagnosticsE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/CriticalityE2.c b/src/codec_utils/E2AP_OLD1/CriticalityE2.c new file mode 100644 index 000000000..45a5d8728 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "CriticalityE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_CriticalityE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_CriticalityE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_CriticalityE2_value2enum_1[] = { + { 0, 6, "reject" }, + { 1, 6, "ignore" }, + { 2, 6, "notify" } +}; +static const unsigned int asn_MAP_CriticalityE2_enum2value_1[] = { + 1, /* ignore(1) */ + 2, /* notify(2) */ + 0 /* reject(0) */ +}; +const asn_INTEGER_specifics_t asn_SPC_CriticalityE2_specs_1 = { + asn_MAP_CriticalityE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_CriticalityE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_CriticalityE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_CriticalityE2 = { + "CriticalityE2", + "CriticalityE2", + &asn_OP_NativeEnumerated, + asn_DEF_CriticalityE2_tags_1, + sizeof(asn_DEF_CriticalityE2_tags_1) + /sizeof(asn_DEF_CriticalityE2_tags_1[0]), /* 1 */ + asn_DEF_CriticalityE2_tags_1, /* Same as above */ + sizeof(asn_DEF_CriticalityE2_tags_1) + /sizeof(asn_DEF_CriticalityE2_tags_1[0]), /* 1 */ + { &asn_OER_type_CriticalityE2_constr_1, &asn_PER_type_CriticalityE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_CriticalityE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/CriticalityE2.h b/src/codec_utils/E2AP_OLD1/CriticalityE2.h new file mode 100644 index 000000000..fea39ba66 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/CriticalityE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _CriticalityE2_H_ +#define _CriticalityE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum CriticalityE2 { + CriticalityE2_reject = 0, + CriticalityE2_ignore = 1, + CriticalityE2_notify = 2 +} e_CriticalityE2; + +/* CriticalityE2 */ +typedef long CriticalityE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_CriticalityE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_CriticalityE2; +extern const asn_INTEGER_specifics_t asn_SPC_CriticalityE2_specs_1; +asn_struct_free_f CriticalityE2_free; +asn_struct_print_f CriticalityE2_print; +asn_constr_check_f CriticalityE2_constraint; +ber_type_decoder_f CriticalityE2_decode_ber; +der_type_encoder_f CriticalityE2_encode_der; +xer_type_decoder_f CriticalityE2_decode_xer; +xer_type_encoder_f CriticalityE2_encode_xer; +oer_type_decoder_f CriticalityE2_decode_oer; +oer_type_encoder_f CriticalityE2_encode_oer; +per_type_decoder_f CriticalityE2_decode_uper; +per_type_encoder_f CriticalityE2_encode_uper; +per_type_decoder_f CriticalityE2_decode_aper; +per_type_encoder_f CriticalityE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CriticalityE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/E2AP-PDU.c b/src/codec_utils/E2AP_OLD1/E2AP-PDU.c new file mode 100644 index 000000000..da98a385f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2AP-PDU.c @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2AP-PDU.h" + +#include "InitiatingMessageE2.h" +#include "SuccessfulOutcomeE2.h" +#include "UnsuccessfulOutcomeE2.h" +static asn_oer_constraints_t asn_OER_type_E2AP_PDU_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_E2AP_PDU_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_E2AP_PDU_1[] = { + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.initiatingMessage), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_InitiatingMessageE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "initiatingMessage" + }, + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.successfulOutcome), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SuccessfulOutcomeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "successfulOutcome" + }, + { ATF_POINTER, 0, offsetof(struct E2AP_PDU, choice.unsuccessfulOutcome), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_UnsuccessfulOutcomeE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "unsuccessfulOutcome" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_E2AP_PDU_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* unsuccessfulOutcome */ +}; +static asn_CHOICE_specifics_t asn_SPC_E2AP_PDU_specs_1 = { + sizeof(struct E2AP_PDU), + offsetof(struct E2AP_PDU, _asn_ctx), + offsetof(struct E2AP_PDU, present), + sizeof(((struct E2AP_PDU *)0)->present), + asn_MAP_E2AP_PDU_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_E2AP_PDU = { + "E2AP-PDU", + "E2AP-PDU", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_E2AP_PDU_constr_1, &asn_PER_type_E2AP_PDU_constr_1, CHOICE_constraint }, + asn_MBR_E2AP_PDU_1, + 3, /* Elements count */ + &asn_SPC_E2AP_PDU_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/E2AP-PDU.h b/src/codec_utils/E2AP_OLD1/E2AP-PDU.h new file mode 100644 index 000000000..04086642d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2AP-PDU.h @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2AP_PDU_H_ +#define _E2AP_PDU_H_ + + +#include +#include +#include +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum E2AP_PDU_PR { + E2AP_PDU_PR_NOTHING, /* No components present */ + E2AP_PDU_PR_initiatingMessage, + E2AP_PDU_PR_successfulOutcome, + E2AP_PDU_PR_unsuccessfulOutcome + /* Extensions may appear below */ + +} E2AP_PDU_PR; + +/* Forward declarations */ +struct InitiatingMessageE2; +struct SuccessfulOutcomeE2; +struct UnsuccessfulOutcomeE2; + +/* E2AP-PDU */ +typedef struct E2AP_PDU { + E2AP_PDU_PR present; + union E2AP_PDU_u { + struct InitiatingMessageE2 *initiatingMessage; + struct SuccessfulOutcomeE2 *successfulOutcome; + struct UnsuccessfulOutcomeE2 *unsuccessfulOutcome; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2AP_PDU_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2AP_PDU; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2AP_PDU_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/E2AP.asn1 b/src/codec_utils/E2AP_OLD1/E2AP.asn1 new file mode 100644 index 000000000..28b51d221 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2AP.asn1 @@ -0,0 +1,1452 @@ +-- ASN1START +-- ************************************************************** +-- +-- Elementary Procedure definitions +-- Derived from 3GPP 38.413 v15.4.0 NGAP +-- ************************************************************** + +E2AP-PDU-Descriptions { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-PDU-Descriptions (0) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + CriticalityE2, + ProcedureCodeE2 +FROM E2AP-CommonDataTypes + + + + E2setupFailure, + E2setupRequest, + E2setupResponse, + ErrorIndicationE2, + ResetRequest, + ResetResponse, + RICcontrolAcknowledge, + RICcontrolFailure, + RICcontrolRequest, + RICindication, + RICserviceQuery, + RICserviceUpdate, + RICserviceUpdateAcknowledge, + RICserviceUpdateFailure, + RICsubscriptionFailure, + RICsubscriptionRequest, + RICsubscriptionResponse, + RICsubscriptionDeleteFailure, + RICsubscriptionDeleteRequest, + RICsubscriptionDeleteResponse +FROM E2AP-PDU-Contents + + id-E2setup, + id-ErrorIndicationE2, + id-Reset, + id-RICcontrol, + id-RICindication, + id-RICserviceQuery, + id-RICserviceUpdate, + id-RICsubscription, + id-RICsubscriptionDelete +FROM E2AP-Constants; + +-- ************************************************************** +-- +-- Interface Elementary Procedure Class +-- +-- ************************************************************** + +E2AP-ELEMENTARY-PROCEDURE ::= CLASS { + &InitiatingMessageE2 , + &SuccessfulOutcomeE2 OPTIONAL , + &UnsuccessfulOutcomeE2 OPTIONAL , + &procedureCode ProcedureCodeE2 UNIQUE , + &criticality CriticalityE2 DEFAULT ignore +} + +WITH SYNTAX { + INITIATING MESSAGE &InitiatingMessageE2 + [SUCCESSFUL OUTCOME &SuccessfulOutcomeE2] + [UNSUCCESSFUL OUTCOME &UnsuccessfulOutcomeE2] + PROCEDURE CODE &procedureCode + [CRITICALITY &criticality] +} + +-- ************************************************************** +-- +-- Interface PDU Definition +-- +-- ************************************************************** + +E2AP-PDU ::= CHOICE { + initiatingMessage InitiatingMessageE2, + successfulOutcome SuccessfulOutcomeE2, + unsuccessfulOutcome UnsuccessfulOutcomeE2, + ... +} + +InitiatingMessageE2 ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&InitiatingMessageE2 ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}) +} + +SuccessfulOutcomeE2 ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&SuccessfulOutcomeE2 ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}) +} + +UnsuccessfulOutcomeE2 ::= SEQUENCE { + procedureCode E2AP-ELEMENTARY-PROCEDURE.&procedureCode ({E2AP-ELEMENTARY-PROCEDURES}), + criticality E2AP-ELEMENTARY-PROCEDURE.&criticality ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}), + value E2AP-ELEMENTARY-PROCEDURE.&UnsuccessfulOutcomeE2 ({E2AP-ELEMENTARY-PROCEDURES}{@procedureCode}) +} + +-- ************************************************************** +-- +-- Interface Elementary Procedure List +-- +-- ************************************************************** + +E2AP-ELEMENTARY-PROCEDURES E2AP-ELEMENTARY-PROCEDURE ::= { + E2AP-ELEMENTARY-PROCEDURES-CLASS-1 | + E2AP-ELEMENTARY-PROCEDURES-CLASS-2, + ... +} + +E2AP-ELEMENTARY-PROCEDURES-CLASS-1 E2AP-ELEMENTARY-PROCEDURE ::= { + ricSubscription | + ricSubscriptionDelete | + ricServiceUpdate | + ricControl | + e2setup | + reset, + ... +} + +E2AP-ELEMENTARY-PROCEDURES-CLASS-2 E2AP-ELEMENTARY-PROCEDURE ::= { + ricIndication | + ricServiceQuery | + errorIndication, + ... +} + +-- ************************************************************** +-- +-- Interface Elementary Procedures +-- +-- ************************************************************** + +e2setup E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE E2setupRequest + SUCCESSFUL OUTCOME E2setupResponse + UNSUCCESSFUL OUTCOME E2setupFailure + PROCEDURE CODE id-E2setup + CRITICALITY reject +} + +errorIndication E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE ErrorIndicationE2 + PROCEDURE CODE id-ErrorIndicationE2 + CRITICALITY ignore +} + +reset E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE ResetRequest + SUCCESSFUL OUTCOME ResetResponse + PROCEDURE CODE id-Reset + CRITICALITY reject +} + +ricControl E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICcontrolRequest + SUCCESSFUL OUTCOME RICcontrolAcknowledge + UNSUCCESSFUL OUTCOME RICcontrolFailure + PROCEDURE CODE id-RICcontrol + CRITICALITY reject +} + +ricIndication E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICindication + PROCEDURE CODE id-RICindication + CRITICALITY ignore +} + +ricServiceQuery E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICserviceQuery + PROCEDURE CODE id-RICserviceQuery + CRITICALITY ignore +} + +ricServiceUpdate E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICserviceUpdate + SUCCESSFUL OUTCOME RICserviceUpdateAcknowledge + UNSUCCESSFUL OUTCOME RICserviceUpdateFailure + PROCEDURE CODE id-RICserviceUpdate + CRITICALITY reject +} + +ricSubscription E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICsubscriptionRequest + SUCCESSFUL OUTCOME RICsubscriptionResponse + UNSUCCESSFUL OUTCOME RICsubscriptionFailure + PROCEDURE CODE id-RICsubscription + CRITICALITY reject +} + +ricSubscriptionDelete E2AP-ELEMENTARY-PROCEDURE ::= { + INITIATING MESSAGE RICsubscriptionDeleteRequest + SUCCESSFUL OUTCOME RICsubscriptionDeleteResponse + UNSUCCESSFUL OUTCOME RICsubscriptionDeleteFailure + PROCEDURE CODE id-RICsubscriptionDelete + CRITICALITY reject +} + + +END +-- ASN1STOP + + + +-- ASN1START +-- ************************************************************** +-- +-- PDU definitions for E2AP +-- Derived from 3GPP 38.413 v15.4.0 NGAP +-- +-- ************************************************************** + +E2AP-PDU-Contents { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-PDU-Contents (1) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + CauseE2, + CriticalityDiagnosticsE2, + GlobalE2node-ID, + GlobalRIC-ID, + RANfunctionDefinition, + RANfunctionID, + RANfunctionRevision, + RICactionDefinition, + RICactionID, + RICactionType, + RICcallProcessID, + RICcontrolAckRequest, + RICcontrolHeader, + RICcontrolMessage, + RICcontrolOutcome, + RICcontrolStatus, + RICeventTriggerDefinition, + RICindicationHeader, + RICindicationMessage, + RICindicationSN, + RICindicationType, + RICrequestID, + RICsubsequentAction, + TimeToWaitE2 +FROM E2AP-IEs + + ProtocolIE-ContainerE2{}, + ProtocolIE-ContainerList{}, + ProtocolIE-SingleContainerE2{}, + E2AP-PROTOCOL-IES, + E2AP-PROTOCOL-IES-PAIR +FROM E2AP-Containers + + id-CauseE2, + id-CriticalityDiagnosticsE2, + id-GlobalE2node-ID, + id-GlobalRIC-ID, + id-RANfunctionID, + id-RANfunctionID-Item, + id-RANfunctionIEcause-Item, + id-RANfunction-Item, + id-RANfunctionsAccepted, + id-RANfunctionsAdded, + id-RANfunctionsDeleted, + id-RANfunctionsModified, + id-RANfunctionsRejected, + id-RICaction-Admitted-Item, + id-RICactionID, + id-RICaction-NotAdmitted-Item, + id-RICactions-Admitted, + id-RICactions-NotAdmitted, + id-RICaction-ToBeSetup-Item, + id-RICcallProcessID, + id-RICcontrolAckRequest, + id-RICcontrolHeader, + id-RICcontrolMessage, + id-RICcontrolOutcome, + id-RICcontrolStatus, + id-RICindicationHeader, + id-RICindicationMessage, + id-RICindicationSN, + id-RICindicationType, + id-RICrequestID, + id-RICserviceQuery, + id-RICsubscriptionDetails, + id-TimeToWaitE2, + + maxofRANfunctionID, + maxofRICactionID +FROM E2AP-Constants; + +-- ************************************************************** +-- +-- MESSAGES FOR NEAR-RT RIC FUNCTIONAL PROCEDURES +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- RIC Subscription Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SUBSCRIPTION REQUEST +-- +-- ************************************************************** +RICsubscriptionRequest ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICsubscriptionRequest-IEs}}, + ... +} + +RICsubscriptionRequest-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory}| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory}| + { ID id-RICsubscriptionDetails CRITICALITY reject TYPE RICsubscriptionDetails PRESENCE mandatory}, + ... +} + + +RICsubscriptionDetails ::= SEQUENCE { + ricEventTriggerDefinition RICeventTriggerDefinition, + ricAction-ToBeSetup-List RICactions-ToBeSetup-List, + ... +} + +RICactions-ToBeSetup-List ::= SEQUENCE (SIZE(1..maxofRICactionID)) OF ProtocolIE-SingleContainerE2 { {RICaction-ToBeSetup-ItemIEs} } + +RICaction-ToBeSetup-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RICaction-ToBeSetup-Item CRITICALITY ignore TYPE RICaction-ToBeSetup-Item PRESENCE mandatory }, + ... +} + +RICaction-ToBeSetup-Item ::= SEQUENCE { + ricActionID RICactionID, + ricActionType RICactionType, + ricActionDefinition RICactionDefinition OPTIONAL, + ricSubsequentAction RICsubsequentAction OPTIONAL, + ... +} + +-- ************************************************************** +-- +-- RIC SUBSCRIPTION RESPONSE +-- +-- ************************************************************** +RICsubscriptionResponse ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2{{RICsubscriptionResponse-IEs}}, + ... +} + +RICsubscriptionResponse-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory } | + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory } | + { ID id-RICactions-Admitted CRITICALITY reject TYPE RICaction-Admitted-List PRESENCE mandatory } | + { ID id-RICactions-NotAdmitted CRITICALITY reject TYPE RICaction-NotAdmitted-List PRESENCE optional }, + ... +} + + + +RICaction-Admitted-List ::= SEQUENCE (SIZE(1..maxofRICactionID)) OF ProtocolIE-SingleContainerE2{{RICaction-Admitted-ItemIEs}} + +RICaction-Admitted-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RICaction-Admitted-Item CRITICALITY ignore TYPE RICaction-Admitted-Item PRESENCE mandatory }, + ... +} + +RICaction-Admitted-Item ::= SEQUENCE { + ricActionID RICactionID, + ... +} + +RICaction-NotAdmitted-List ::= SEQUENCE (SIZE(0..maxofRICactionID)) OF ProtocolIE-SingleContainerE2 { {RICaction-NotAdmitted-ItemIEs} } + +RICaction-NotAdmitted-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RICaction-NotAdmitted-Item CRITICALITY ignore TYPE RICaction-NotAdmitted-Item PRESENCE mandatory }, + ... +} + +RICaction-NotAdmitted-Item ::= SEQUENCE { + ricActionID RICactionID, + cause CauseE2, + ... +} + +-- ************************************************************** +-- +-- RIC SUBSCRIPTION FAILURE +-- +-- ************************************************************** +RICsubscriptionFailure ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICsubscriptionFailure-IEs}}, + ... +} + +RICsubscriptionFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-RICactions-NotAdmitted CRITICALITY reject TYPE RICaction-NotAdmitted-List PRESENCE mandatory }| + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Subscription Delete Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SUBSCRIPTION DELETE REQUEST +-- +-- ************************************************************** +RICsubscriptionDeleteRequest ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICsubscriptionDeleteRequest-IEs}}, + ... +} + +RICsubscriptionDeleteRequest-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }, + ... +} + +-- ************************************************************** +-- +-- RIC SUBSCRIPTION DELETE RESPONSE +-- +-- ************************************************************** +RICsubscriptionDeleteResponse ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICsubscriptionDeleteResponse-IEs}}, + ... +} + +RICsubscriptionDeleteResponse-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }, + ... +} +-- ************************************************************** +-- +-- RIC SUBSCRIPTION DELETE FAILURE +-- +-- ************************************************************** +RICsubscriptionDeleteFailure ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICsubscriptionDeleteFailure-IEs}}, + ... +} + +RICsubscriptionDeleteFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-CauseE2 CRITICALITY ignore TYPE CauseE2 PRESENCE mandatory }| + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Indication Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC INDICATION +-- +-- ************************************************************** +RICindication ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICindication-IEs}}, + ... +} + +RICindication-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-RICactionID CRITICALITY reject TYPE RICactionID PRESENCE mandatory }| + { ID id-RICindicationSN CRITICALITY reject TYPE RICindicationSN PRESENCE optional }| + { ID id-RICindicationType CRITICALITY reject TYPE RICindicationType PRESENCE mandatory }| + { ID id-RICindicationHeader CRITICALITY reject TYPE RICindicationHeader PRESENCE mandatory }| + { ID id-RICindicationMessage CRITICALITY reject TYPE RICindicationMessage PRESENCE mandatory }| + { ID id-RICcallProcessID CRITICALITY reject TYPE RICcallProcessID PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Control Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC CONTROL REQUEST +-- +-- ************************************************************** +RICcontrolRequest ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICcontrolRequest-IEs}}, + ... +} + +RICcontrolRequest-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-RICcallProcessID CRITICALITY reject TYPE RICcallProcessID PRESENCE optional }| + { ID id-RICcontrolHeader CRITICALITY reject TYPE RICcontrolHeader PRESENCE mandatory }| + { ID id-RICcontrolMessage CRITICALITY reject TYPE RICcontrolMessage PRESENCE mandatory }| + { ID id-RICcontrolAckRequest CRITICALITY reject TYPE RICcontrolAckRequest PRESENCE optional }, + ... +} +-- ************************************************************** +-- +-- RIC CONTROL ACKNOWLEDGE +-- +-- ************************************************************** +RICcontrolAcknowledge ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICcontrolAcknowledge-IEs}}, + ... +} + +RICcontrolAcknowledge-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-RICcallProcessID CRITICALITY reject TYPE RICcallProcessID PRESENCE optional }| + { ID id-RICcontrolStatus CRITICALITY reject TYPE RICcontrolStatus PRESENCE mandatory } | + { ID id-RICcontrolOutcome CRITICALITY reject TYPE RICcontrolOutcome PRESENCE optional }, + ... +} +-- ************************************************************** +-- +-- RIC CONTROL FAILURE +-- +-- ************************************************************** +RICcontrolFailure ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICcontrolFailure-IEs}}, + ... +} + +RICcontrolFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE mandatory }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE mandatory }| + { ID id-RICcallProcessID CRITICALITY reject TYPE RICcallProcessID PRESENCE optional }| + { ID id-CauseE2 CRITICALITY ignore TYPE CauseE2 PRESENCE mandatory } | + { ID id-RICcontrolOutcome CRITICALITY reject TYPE RICcontrolOutcome PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- MESSAGES FOR GLOBAL PROCEDURES +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- Error Indication Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- ERROR INDICATION +-- +-- ************************************************************** +ErrorIndicationE2 ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{ErrorIndicationE2-IEs}}, + ... +} + +ErrorIndicationE2-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RICrequestID CRITICALITY reject TYPE RICrequestID PRESENCE optional }| + { ID id-RANfunctionID CRITICALITY reject TYPE RANfunctionID PRESENCE optional }| + { ID id-CauseE2 CRITICALITY ignore TYPE CauseE2 PRESENCE optional }| + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 Setup Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- E2 SETUP REQUEST +-- +-- ************************************************************** + +E2setupRequest ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 { {E2setupRequestIEs} }, + ... +} + +E2setupRequestIEs E2AP-PROTOCOL-IES ::= { + { ID id-GlobalE2node-ID CRITICALITY reject TYPE GlobalE2node-ID PRESENCE mandatory }| + { ID id-RANfunctionsAdded CRITICALITY reject TYPE RANfunctions-List PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 SETUP RESPONSE +-- +-- ************************************************************** + +E2setupResponse ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 { {E2setupResponseIEs} }, + ... +} + +E2setupResponseIEs E2AP-PROTOCOL-IES ::= { + { ID id-GlobalRIC-ID CRITICALITY reject TYPE GlobalRIC-ID PRESENCE mandatory }| + { ID id-RANfunctionsAccepted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE optional }| + { ID id-RANfunctionsRejected CRITICALITY reject TYPE RANfunctionsIDcause-List PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- E2 SETUP FAILURE +-- +-- ************************************************************** + +E2setupFailure ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 { {E2setupFailureIEs} }, + ... +} + +E2setupFailureIEs E2AP-PROTOCOL-IES ::= { + { ID id-CauseE2 CRITICALITY ignore TYPE CauseE2 PRESENCE mandatory }| + { ID id-TimeToWaitE2 CRITICALITY ignore TYPE TimeToWaitE2 PRESENCE optional }| + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- Reset Elementary Procedure +-- +-- ************************************************************** + +-- ************************************************************** +-- +-- RESET REQUEST +-- +-- ************************************************************** + +ResetRequest ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 { {ResetRequestIEs} }, + ... +} + +ResetRequestIEs E2AP-PROTOCOL-IES ::= { + { ID id-CauseE2 CRITICALITY ignore TYPE CauseE2 PRESENCE mandatory }, + ... +} + +-- ************************************************************** +-- +-- RESET RESPONSE +-- +-- ************************************************************** + +ResetResponse ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 { {ResetResponseIEs} }, + ... +} + +ResetResponseIEs E2AP-PROTOCOL-IES ::= { + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Service Update Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SERVICE UPDATE +-- +-- ************************************************************** +RICserviceUpdate ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICserviceUpdate-IEs}}, + ... +} + +RICserviceUpdate-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionsAdded CRITICALITY reject TYPE RANfunctions-List PRESENCE optional }| + { ID id-RANfunctionsModified CRITICALITY reject TYPE RANfunctions-List PRESENCE optional }| + { ID id-RANfunctionsDeleted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE optional }, + ... +} + +RANfunctions-List ::= SEQUENCE (SIZE(0..maxofRANfunctionID)) OF ProtocolIE-SingleContainerE2 { {RANfunction-ItemIEs} } + +RANfunction-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunction-Item CRITICALITY ignore TYPE RANfunction-Item PRESENCE mandatory }, + ... +} + + +RANfunction-Item ::= SEQUENCE { + ranFunctionID RANfunctionID, + ranFunctionDefinition RANfunctionDefinition, + ranFunctionRevision RANfunctionRevision, + ... +} + +RANfunctionsID-List ::= SEQUENCE (SIZE(0..maxofRANfunctionID)) OF ProtocolIE-SingleContainerE2{{RANfunctionID-ItemIEs}} + +RANfunctionID-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionID-Item CRITICALITY ignore TYPE RANfunctionID-Item PRESENCE mandatory }, + ... +} + +RANfunctionID-Item ::= SEQUENCE { + ranFunctionID RANfunctionID, + ranFunctionRevision RANfunctionRevision, + ... +} + +-- ************************************************************** +-- +-- RIC SERVICE UPDATE ACKNOWLEDGE +-- +-- ************************************************************** +RICserviceUpdateAcknowledge ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICserviceUpdateAcknowledge-IEs}}, + ... +} + +RICserviceUpdateAcknowledge-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionsAccepted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE optional }| + { ID id-RANfunctionsRejected CRITICALITY reject TYPE RANfunctionsIDcause-List PRESENCE optional }, + ... +} + +RANfunctionsIDcause-List ::= SEQUENCE (SIZE(0..maxofRANfunctionID)) OF ProtocolIE-SingleContainerE2 { {RANfunctionIDcause-ItemIEs} } + +RANfunctionIDcause-ItemIEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionIEcause-Item CRITICALITY ignore TYPE RANfunctionIDcause-Item PRESENCE mandatory }, + ... +} + + +RANfunctionIDcause-Item ::= SEQUENCE { + ranFunctionID RANfunctionID, + cause CauseE2, + ... +} + + +-- ************************************************************** +-- +-- RIC SERVICE UPDATE FAILURE +-- +-- ************************************************************** +RICserviceUpdateFailure ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICserviceUpdateFailure-IEs}}, + ... +} + +RICserviceUpdateFailure-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionsRejected CRITICALITY ignore TYPE RANfunctionsIDcause-List PRESENCE optional }| + { ID id-TimeToWaitE2 CRITICALITY ignore TYPE TimeToWaitE2 PRESENCE optional }| + { ID id-CriticalityDiagnosticsE2 CRITICALITY ignore TYPE CriticalityDiagnosticsE2 PRESENCE optional }, + ... +} + +-- ************************************************************** +-- +-- RIC Service Query Elementary Procedure +-- +-- ************************************************************** +-- ************************************************************** +-- +-- RIC SERVICE QUERY +-- +-- ************************************************************** +RICserviceQuery ::= SEQUENCE { + protocolIEs ProtocolIE-ContainerE2 {{RICserviceQuery-IEs}}, + ... +} + +RICserviceQuery-IEs E2AP-PROTOCOL-IES ::= { + { ID id-RANfunctionsAccepted CRITICALITY reject TYPE RANfunctionsID-List PRESENCE optional }, + ... +} + +END +-- ASN1STOP + +-- ASN1START +-- ************************************************************** +-- E2AP +-- Information Element Definitions +-- +-- ************************************************************** + +E2AP-IEs { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-IEs (2)} + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + CriticalityE2, + PresenceE2, + ProcedureCodeE2, + ProtocolIE-IDE2, + TriggeringMessageE2 +FROM E2AP-CommonDataTypes + + maxnoofErrors, + maxProtocolIEs +FROM E2AP-Constants; + +-- A +-- B +-- C +CauseE2 ::= CHOICE { + ricRequest CauseRIC, + ricService CauseRICservice, + transport CauseTransport, + protocol CauseProtocol, + misc CauseMisc, + ... +} + +CauseMisc ::= ENUMERATED { + control-processing-overload, + hardware-failure, + om-intervention, + unspecified, + ... +} +CauseProtocol ::= ENUMERATED { + transfer-syntax-error, + abstract-syntax-error-reject, + abstract-syntax-error-ignore-and-notify, + message-not-compatible-with-receiver-state, + semantic-error, + abstract-syntax-error-falsely-constructed-message, + unspecified, + ... +} + +CauseRIC ::= ENUMERATED { + ran-function-id-Invalid, + action-not-supported, + excessive-actions, + duplicate-action, + duplicate-event, + function-resource-limit, + request-id-unknown, + inconsistent-action-subsequent-action-sequence, + control-message-invalid, + call-process-id-invalid, + unspecified, + ... +} + +CauseRICservice ::= ENUMERATED{ + function-not-required, + excessive-functions, + ric-resource-limit, + ... +} +CauseTransport ::= ENUMERATED { + unspecified, + transport-resource-unavailable, + ... +} + +-- ************************************************************** +-- copied from 3GPP 38.413 NGAP IEs v15.5.0 +-- note: ie-Extensions removed +-- ************************************************************** +CriticalityDiagnosticsE2 ::= SEQUENCE { + procedureCode ProcedureCodeE2 OPTIONAL, + triggeringMessage TriggeringMessageE2 OPTIONAL, + procedureCriticality CriticalityE2 OPTIONAL, + ricRequestorID RICrequestID OPTIONAL, + iEsCriticalityDiagnosticsE2 CriticalityDiagnostics-IE-ListE2 OPTIONAL, + ... +} + +CriticalityDiagnostics-IE-ListE2 ::= SEQUENCE (SIZE(1..maxnoofErrors)) OF CriticalityDiagnostics-IE-ItemE2 + +CriticalityDiagnostics-IE-ItemE2 ::= SEQUENCE { + iECriticalityE2 CriticalityE2, + iE-ID ProtocolIE-IDE2, + typeOfError TypeOfErrorE2, + ... +} + +-- D +-- E + +-- ************************************************************** +-- copied from 3GPP X2AP IEs v15.4.0 +-- note: ie-Extensions removed +-- ************************************************************** +ENB-ID ::= CHOICE { + macro-eNB-ID BIT STRING (SIZE (20)), + home-eNB-ID BIT STRING (SIZE (28)), + ... , + short-Macro-eNB-ID BIT STRING (SIZE(18)), + long-Macro-eNB-ID BIT STRING (SIZE(21)) +} +-- ************************************************************** +-- copied from 3GPP 38.423 v15.5.0 XnAP IEs +-- ************************************************************** +ENB-ID-Choice ::= CHOICE { + enb-ID-macro BIT STRING (SIZE(20)), + enb-ID-shortmacro BIT STRING (SIZE(18)), + enb-ID-longmacro BIT STRING (SIZE(21)), + ... +} + +-- ************************************************************** +-- copied from 3GPP X2AP IEs v15.4.0 +-- note: ie-Extensions removed +-- Note: to avoid duplicate names with XnAP, GNB-ID renamed ENGNB-ID, GlobalGNB-ID renamed GlobalenGNB-ID +-- ************************************************************** +ENGNB-ID ::= CHOICE { + gNB-ID BIT STRING (SIZE (22..32)), + ... +} + +-- F +-- G +GlobalE2node-ID ::= CHOICE{ + gNB GlobalE2node-gNB-ID, + en-gNB GlobalE2node-en-gNB-ID, + ng-eNB GlobalE2node-ng-eNB-ID, + eNB GlobalE2node-eNB-ID, + ... +} + +GlobalE2node-en-gNB-ID ::= SEQUENCE{ + global-gNB-ID GlobalenGNB-ID, + ... +} +GlobalE2node-eNB-ID ::= SEQUENCE{ + global-eNB-ID GlobalENB-ID, + ... +} +GlobalE2node-gNB-ID ::= SEQUENCE{ + global-gNB-ID GlobalgNB-ID, + gNB-CU-UP-ID GNB-CU-UP-ID OPTIONAL, + gNB-DU-ID GNB-DU-IDE2 OPTIONAL, + ... +} +GlobalE2node-ng-eNB-ID ::= SEQUENCE{ + global-ng-eNB-ID GlobalngeNB-ID, + ... +} +-- ************************************************************** +-- copied from 3GPP X2AP IEs v15.4.0 +-- note: ie-Extensions removed +-- ************************************************************** + +GlobalENB-ID ::= SEQUENCE { + pLMN-Identity PLMN-IdentityE2, + eNB-ID ENB-ID, + ... +} +-- ************************************************************** +-- copied from 3GPP X2AP IEs v15.4.0 +-- Note: to avoid duplicate names with XnAP, GNB-ID renamed ENGNB-ID, GlobalGNB-ID renamed GlobalenGNB-ID +-- ************************************************************** +GlobalenGNB-ID ::= SEQUENCE { + pLMN-Identity PLMN-IdentityE2, + gNB-ID ENGNB-ID, + ... +} +-- ************************************************************** +-- copied from 3GPP 38.423 v15.5.0 XnAP IEs +-- ************************************************************** +GlobalgNB-ID ::= SEQUENCE { + plmn-id PLMN-IdentityE2, + gnb-id GNB-ID-Choice, + ... +} + + +-- ************************************************************** +-- copied from 3GPP 38.423 v15.5.0 XnAP IEs +-- ************************************************************** +GlobalngeNB-ID ::= SEQUENCE { + plmn-id PLMN-IdentityE2, + enb-id ENB-ID-Choice, + ... +} + +GlobalRIC-ID ::= SEQUENCE{ + pLMN-Identity PLMN-IdentityE2, + ric-ID BIT STRING (SIZE (20)), + ... +} + +-- ************************************************************** +-- copied from 3GPP 38.463 v15.5.0 E1AP IEs +-- ************************************************************** +GNB-CU-UP-ID::= INTEGER (0..68719476735) +GNB-DU-IDE2::= INTEGER (0..68719476735) + +-- ************************************************************** +-- copied from 3GPP 38.423 v15.5.0 XnAP IEs +-- ************************************************************** +GNB-ID-Choice ::= CHOICE { + gnb-ID BIT STRING (SIZE(22..32)), + ... +} +-- H +-- I +-- J +-- K +-- L +-- M +-- N +-- O +-- P +-- ************************************************************** +-- copied from 3GPP X2AP IEs v15.4.0 +-- ************************************************************** +PLMN-IdentityE2 ::= OCTET STRING (SIZE(3)) + +-- Q +-- R +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RANfunctionDefinition ::= OCTET STRING + +RANfunctionID ::= INTEGER (0..4095) + +RANfunctionRevision ::= INTEGER (0..4095) + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICactionDefinition ::= OCTET STRING + +RICactionID ::= INTEGER (0..255) + +RICactionType ::= ENUMERATED{ + report, + insert, + policy, + ... +} + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcallProcessID ::= OCTET STRING + +RICcontrolAckRequest ::= ENUMERATED{ + noAck, + ack, + nAck, + ... +} + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolHeader ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolMessage ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICcontrolOutcome ::= OCTET STRING + +RICcontrolStatus ::= ENUMERATED{ + success, + rejected, + failed, + ... +} + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICeventTriggerDefinition ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICindicationHeader ::= OCTET STRING + +-- ************************************************************** +-- Following IE defined in E2SM +-- ************************************************************** +RICindicationMessage ::= OCTET STRING + +RICindicationSN ::= INTEGER (0..65535) + +RICindicationType ::= ENUMERATED{ + report, + insert, + ... +} + +RICrequestID ::= SEQUENCE { + ricRequestorID INTEGER (0..65535), + ricInstanceID INTEGER (0..65535), + ... +} + +RICsubsequentAction ::=SEQUENCE{ + ricSubsequentActionType RICsubsequentActionType, + ricTimeToWait RICtimeToWait, + ... +} + +RICsubsequentActionType ::= ENUMERATED{ + continue, + wait, + ... +} + +RICtimeToWait ::= ENUMERATED{ + zero, + w1ms, + w2ms, + w5ms, + w10ms, + w20ms, + w30ms, + w40ms, + w50ms, + w100ms, + w200ms, + w500ms, + w1s, + w2s, + w5s, + w10s, + w20s, + w60s, + ... +} +-- S +-- T +-- ************************************************************** +-- copied from 3GPP 38.413 NGAP IEs v15.5.0 +-- ************************************************************** +TimeToWaitE2 ::= ENUMERATED {v1s, v2s, v5s, v10s, v20s, v60s, ...} + +-- ************************************************************** +-- copied from 3GPP 38.413 NGAP IEs v15.5.0 +-- ************************************************************** +TypeOfErrorE2 ::= ENUMERATED { + not-understood, + missing, + ... +} + +-- U +-- V +-- W +-- X +-- Y +-- Z + +END +-- ASN1STOP + +-- ASN1START +-- ************************************************************** +-- +-- Common definitions +-- Derived from 3GPP 38.413 v15.4.0 +-- +-- ************************************************************** + +E2AP-CommonDataTypes { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-CommonDataTypes (3) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +CriticalityE2 ::= ENUMERATED { reject, ignore, notify } + +PresenceE2 ::= ENUMERATED { optional, conditional, mandatory } + +ProcedureCodeE2 ::= INTEGER (0..255) + +ProtocolIE-IDE2 ::= INTEGER (0..65535) + +TriggeringMessageE2 ::= ENUMERATED { initiating-message, successful-outcome, unsuccessfull-outcome } + +END +-- ASN1STOP + +-- ASN1START +-- ************************************************************** +-- +-- Constant definitions +-- +-- ************************************************************** + +E2AP-Constants { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-Constants (4) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +IMPORTS + ProcedureCodeE2, + ProtocolIE-IDE2 +FROM E2AP-CommonDataTypes; + +-- ************************************************************** +-- +-- Elementary Procedures +-- +-- ************************************************************** +id-E2setup ProcedureCodeE2 ::= 1 +id-ErrorIndicationE2 ProcedureCodeE2 ::= 2 +id-Reset ProcedureCodeE2 ::= 3 +id-RICcontrol ProcedureCodeE2 ::= 4 +id-RICindication ProcedureCodeE2 ::= 5 +id-RICserviceQuery ProcedureCodeE2 ::= 6 +id-RICserviceUpdate ProcedureCodeE2 ::= 7 +id-RICsubscription ProcedureCodeE2 ::= 8 +id-RICsubscriptionDelete ProcedureCodeE2 ::= 9 + +-- ************************************************************** +-- +-- Extension constants +-- +-- ************************************************************** + +maxProtocolIEs INTEGER ::= 65535 + + +-- ************************************************************** +-- +-- Lists +-- +-- ************************************************************** +maxnoofErrors INTEGER ::= 256 +maxofRANfunctionID INTEGER ::= 256 +maxofRICactionID INTEGER ::= 16 + +-- ************************************************************** +-- +-- IEs +-- +-- ************************************************************** +id-CauseE2 ProtocolIE-IDE2 ::= 1 +id-CriticalityDiagnosticsE2 ProtocolIE-IDE2 ::= 2 +id-GlobalE2node-ID ProtocolIE-IDE2 ::= 3 +id-GlobalRIC-ID ProtocolIE-IDE2 ::= 4 +id-RANfunctionID ProtocolIE-IDE2 ::= 5 +id-RANfunctionID-Item ProtocolIE-IDE2 ::= 6 +id-RANfunctionIEcause-Item ProtocolIE-IDE2 ::= 7 +id-RANfunction-Item ProtocolIE-IDE2 ::= 8 +id-RANfunctionsAccepted ProtocolIE-IDE2 ::= 9 +id-RANfunctionsAdded ProtocolIE-IDE2 ::= 10 +id-RANfunctionsDeleted ProtocolIE-IDE2 ::= 11 +id-RANfunctionsModified ProtocolIE-IDE2 ::= 12 +id-RANfunctionsRejected ProtocolIE-IDE2 ::= 13 +id-RICaction-Admitted-Item ProtocolIE-IDE2 ::= 14 +id-RICactionID ProtocolIE-IDE2 ::= 15 +id-RICaction-NotAdmitted-Item ProtocolIE-IDE2 ::= 16 +id-RICactions-Admitted ProtocolIE-IDE2 ::= 17 +id-RICactions-NotAdmitted ProtocolIE-IDE2 ::= 18 +id-RICaction-ToBeSetup-Item ProtocolIE-IDE2 ::= 19 +id-RICcallProcessID ProtocolIE-IDE2 ::= 20 +id-RICcontrolAckRequest ProtocolIE-IDE2 ::= 21 +id-RICcontrolHeader ProtocolIE-IDE2 ::= 22 +id-RICcontrolMessage ProtocolIE-IDE2 ::= 23 +id-RICcontrolStatus ProtocolIE-IDE2 ::= 24 +id-RICindicationHeader ProtocolIE-IDE2 ::= 25 +id-RICindicationMessage ProtocolIE-IDE2 ::= 26 +id-RICindicationSN ProtocolIE-IDE2 ::= 27 +id-RICindicationType ProtocolIE-IDE2 ::= 28 +id-RICrequestID ProtocolIE-IDE2 ::= 29 +id-RICsubscriptionDetails ProtocolIE-IDE2 ::= 30 +id-TimeToWaitE2 ProtocolIE-IDE2 ::= 31 +id-RICcontrolOutcome ProtocolIE-IDE2 ::= 32 + + +END +-- ASN1STOP + +-- ASN1START +-- ************************************************************** +-- +-- Container definitions +-- +-- derived from 3GPP 38.413 v15.4.0 +-- ************************************************************** + +E2AP-Containers { +iso(1) identified-organization(3) dod(6) internet(1) private(4) enterprise(1) 53148 e2(1) version1 (1) e2ap(1) e2ap-Containers (5) } + +DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +-- ************************************************************** +-- +-- IE parameter types from other modules. +-- +-- ************************************************************** + +IMPORTS + + CriticalityE2, + PresenceE2, + PrivateIE-ID, + ProtocolExtensionID, + ProtocolIE-IDE2 +FROM E2AP-CommonDataTypes + + maxProtocolIEs +FROM E2AP-Constants; + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +E2AP-PROTOCOL-IES ::= CLASS { + &id ProtocolIE-IDE2 UNIQUE, + &criticality CriticalityE2, + &Value, + &presence PresenceE2 +} +WITH SYNTAX { + ID &id + CRITICALITY &criticality + TYPE &Value + PRESENCE &presence +} + +-- ************************************************************** +-- +-- Class Definition for Protocol IEs +-- +-- ************************************************************** + +E2AP-PROTOCOL-IES-PAIR ::= CLASS { + &id ProtocolIE-IDE2 UNIQUE, + &firstCriticality CriticalityE2, + &FirstValue, + &secondCriticality CriticalityE2, + &SecondValue, + &presence PresenceE2 +} +WITH SYNTAX { + ID &id + FIRST CRITICALITY &firstCriticality + FIRST TYPE &FirstValue + SECOND CRITICALITY &secondCriticality + SECOND TYPE &SecondValue + PRESENCE &presence +} + + + + +-- ************************************************************** +-- +-- Container for Protocol IEs +-- +-- ************************************************************** + +ProtocolIE-ContainerE2 {E2AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldE2 {{IEsSetParam}} + +ProtocolIE-SingleContainerE2 {E2AP-PROTOCOL-IES : IEsSetParam} ::= + ProtocolIE-FieldE2 {{IEsSetParam}} + +ProtocolIE-FieldE2 {E2AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE { + id E2AP-PROTOCOL-IES.&id ({IEsSetParam}), + criticality E2AP-PROTOCOL-IES.&criticality ({IEsSetParam}{@id}), + value E2AP-PROTOCOL-IES.&Value ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container for Protocol IE Pairs +-- +-- ************************************************************** + +ProtocolIE-ContainerPairE2 {E2AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (0..maxProtocolIEs)) OF + ProtocolIE-FieldPairE2 {{IEsSetParam}} + +ProtocolIE-FieldPairE2 {E2AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE { + id E2AP-PROTOCOL-IES-PAIR.&id ({IEsSetParam}), + firstCriticality E2AP-PROTOCOL-IES-PAIR.&firstCriticality ({IEsSetParam}{@id}), + firstValue E2AP-PROTOCOL-IES-PAIR.&FirstValue ({IEsSetParam}{@id}), + secondCriticality E2AP-PROTOCOL-IES-PAIR.&secondCriticality ({IEsSetParam}{@id}), + secondValue E2AP-PROTOCOL-IES-PAIR.&SecondValue ({IEsSetParam}{@id}) +} + +-- ************************************************************** +-- +-- Container Lists for Protocol IE Containers +-- +-- ************************************************************** + +ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, E2AP-PROTOCOL-IES : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-SingleContainerE2 {{IEsSetParam}} + +ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, E2AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= + SEQUENCE (SIZE (lowerBound..upperBound)) OF + ProtocolIE-ContainerPairE2 {{IEsSetParam}} + + +END +-- ASN1STOP diff --git a/src/codec_utils/E2AP_OLD1/E2setupFailure.c b/src/codec_utils/E2AP_OLD1/E2setupFailure.c new file mode 100644 index 000000000..83d21ef79 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupFailure.h" + +asn_TYPE_member_t asn_MBR_E2setupFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P13, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1 = { + sizeof(struct E2setupFailure), + offsetof(struct E2setupFailure, _asn_ctx), + asn_MAP_E2setupFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupFailure = { + "E2setupFailure", + "E2setupFailure", + &asn_OP_SEQUENCE, + asn_DEF_E2setupFailure_tags_1, + sizeof(asn_DEF_E2setupFailure_tags_1) + /sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */ + asn_DEF_E2setupFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupFailure_tags_1) + /sizeof(asn_DEF_E2setupFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupFailure_1, + 1, /* Elements count */ + &asn_SPC_E2setupFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/E2setupFailure.h b/src/codec_utils/E2AP_OLD1/E2setupFailure.h new file mode 100644 index 000000000..22bf6ac5a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupFailure_H_ +#define _E2setupFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupFailure */ +typedef struct E2setupFailure { + ProtocolIE_ContainerE2_1407P13_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/E2setupRequest.c b/src/codec_utils/E2AP_OLD1/E2setupRequest.c new file mode 100644 index 000000000..fcd8a379d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupRequest.h" + +asn_TYPE_member_t asn_MBR_E2setupRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P11, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1 = { + sizeof(struct E2setupRequest), + offsetof(struct E2setupRequest, _asn_ctx), + asn_MAP_E2setupRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupRequest = { + "E2setupRequest", + "E2setupRequest", + &asn_OP_SEQUENCE, + asn_DEF_E2setupRequest_tags_1, + sizeof(asn_DEF_E2setupRequest_tags_1) + /sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */ + asn_DEF_E2setupRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupRequest_tags_1) + /sizeof(asn_DEF_E2setupRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupRequest_1, + 1, /* Elements count */ + &asn_SPC_E2setupRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/E2setupRequest.h b/src/codec_utils/E2AP_OLD1/E2setupRequest.h new file mode 100644 index 000000000..283c8cab8 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupRequest_H_ +#define _E2setupRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupRequest */ +typedef struct E2setupRequest { + ProtocolIE_ContainerE2_1407P11_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/E2setupResponse.c b/src/codec_utils/E2AP_OLD1/E2setupResponse.c new file mode 100644 index 000000000..5a9943af4 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "E2setupResponse.h" + +asn_TYPE_member_t asn_MBR_E2setupResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P12, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1 = { + sizeof(struct E2setupResponse), + offsetof(struct E2setupResponse, _asn_ctx), + asn_MAP_E2setupResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupResponse = { + "E2setupResponse", + "E2setupResponse", + &asn_OP_SEQUENCE, + asn_DEF_E2setupResponse_tags_1, + sizeof(asn_DEF_E2setupResponse_tags_1) + /sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */ + asn_DEF_E2setupResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_E2setupResponse_tags_1) + /sizeof(asn_DEF_E2setupResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupResponse_1, + 1, /* Elements count */ + &asn_SPC_E2setupResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/E2setupResponse.h b/src/codec_utils/E2AP_OLD1/E2setupResponse.h new file mode 100644 index 000000000..e1ae8e898 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/E2setupResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _E2setupResponse_H_ +#define _E2setupResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* E2setupResponse */ +typedef struct E2setupResponse { + ProtocolIE_ContainerE2_1407P12_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_E2setupResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_E2setupResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _E2setupResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.c b/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.c new file mode 100644 index 000000000..34a2970f1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.c @@ -0,0 +1,192 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID-Choice.h" + +static int +memb_enb_ID_macro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_shortmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_enb_ID_longmacro_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_macro_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_shortmacro_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_enb_ID_longmacro_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_macro), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_macro_constr_2, &asn_PER_memb_enb_ID_macro_constr_2, memb_enb_ID_macro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-macro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_shortmacro), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_shortmacro_constr_3, &asn_PER_memb_enb_ID_shortmacro_constr_3, memb_enb_ID_shortmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-shortmacro" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID_Choice, choice.enb_ID_longmacro), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_enb_ID_longmacro_constr_4, &asn_PER_memb_enb_ID_longmacro_constr_4, memb_enb_ID_longmacro_constraint_1 }, + 0, 0, /* No default value */ + "enb-ID-longmacro" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* enb-ID-macro */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* enb-ID-shortmacro */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* enb-ID-longmacro */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1 = { + sizeof(struct ENB_ID_Choice), + offsetof(struct ENB_ID_Choice, _asn_ctx), + offsetof(struct ENB_ID_Choice, present), + sizeof(((struct ENB_ID_Choice *)0)->present), + asn_MAP_ENB_ID_Choice_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, + 3 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice = { + "ENB-ID-Choice", + "ENB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_Choice_constr_1, &asn_PER_type_ENB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_Choice_1, + 3, /* Elements count */ + &asn_SPC_ENB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.h b/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.h new file mode 100644 index 000000000..c9a3b4008 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENB-ID-Choice.h @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_Choice_H_ +#define _ENB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_Choice_PR { + ENB_ID_Choice_PR_NOTHING, /* No components present */ + ENB_ID_Choice_PR_enb_ID_macro, + ENB_ID_Choice_PR_enb_ID_shortmacro, + ENB_ID_Choice_PR_enb_ID_longmacro + /* Extensions may appear below */ + +} ENB_ID_Choice_PR; + +/* ENB-ID-Choice */ +typedef struct ENB_ID_Choice { + ENB_ID_Choice_PR present; + union ENB_ID_Choice_u { + BIT_STRING_t enb_ID_macro; + BIT_STRING_t enb_ID_shortmacro; + BIT_STRING_t enb_ID_longmacro; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_Choice_1[3]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ENB-ID.c b/src/codec_utils/E2AP_OLD1/ENB-ID.c new file mode 100644 index 000000000..01894152f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENB-ID.c @@ -0,0 +1,241 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENB-ID.h" + +static int +memb_macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_home_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 28)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_short_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 18)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_long_Macro_eNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 21)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_macro_eNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 28 /* (SIZE(28..28)) */}; +static asn_per_constraints_t asn_PER_memb_home_eNB_ID_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 28, 28 } /* (SIZE(28..28)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { 0, 0 }, + 18 /* (SIZE(18..18)) */}; +static asn_per_constraints_t asn_PER_memb_short_Macro_eNB_ID_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 18, 18 } /* (SIZE(18..18)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { 0, 0 }, + 21 /* (SIZE(21..21)) */}; +static asn_per_constraints_t asn_PER_memb_long_Macro_eNB_ID_constr_6 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 21, 21 } /* (SIZE(21..21)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_macro_eNB_ID_constr_2, &asn_PER_memb_macro_eNB_ID_constr_2, memb_macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.home_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_home_eNB_ID_constr_3, &asn_PER_memb_home_eNB_ID_constr_3, memb_home_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "home-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.short_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_short_Macro_eNB_ID_constr_5, &asn_PER_memb_short_Macro_eNB_ID_constr_5, memb_short_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "short-Macro-eNB-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ENB_ID, choice.long_Macro_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_long_Macro_eNB_ID_constr_6, &asn_PER_memb_long_Macro_eNB_ID_constr_6, memb_long_Macro_eNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "long-Macro-eNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* home-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* short-Macro-eNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* long-Macro-eNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1 = { + sizeof(struct ENB_ID), + offsetof(struct ENB_ID, _asn_ctx), + offsetof(struct ENB_ID, present), + sizeof(((struct ENB_ID *)0)->present), + asn_MAP_ENB_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 2 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENB_ID = { + "ENB-ID", + "ENB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENB_ID_constr_1, &asn_PER_type_ENB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENB_ID_1, + 4, /* Elements count */ + &asn_SPC_ENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ENB-ID.h b/src/codec_utils/E2AP_OLD1/ENB-ID.h new file mode 100644 index 000000000..e64a39d9b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENB-ID.h @@ -0,0 +1,61 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENB_ID_H_ +#define _ENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENB_ID_PR { + ENB_ID_PR_NOTHING, /* No components present */ + ENB_ID_PR_macro_eNB_ID, + ENB_ID_PR_home_eNB_ID, + /* Extensions may appear below */ + ENB_ID_PR_short_Macro_eNB_ID, + ENB_ID_PR_long_Macro_eNB_ID +} ENB_ID_PR; + +/* ENB-ID */ +typedef struct ENB_ID { + ENB_ID_PR present; + union ENB_ID_u { + BIT_STRING_t macro_eNB_ID; + BIT_STRING_t home_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + BIT_STRING_t short_Macro_eNB_ID; + BIT_STRING_t long_Macro_eNB_ID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENB_ID_1[4]; +extern asn_per_constraints_t asn_PER_type_ENB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ENGNB-ID.c b/src/codec_utils/E2AP_OLD1/ENGNB-ID.c new file mode 100644 index 000000000..be3e5926f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENGNB-ID.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ENGNB-ID.h" + +static int +memb_gNB_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gNB_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ENGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ENGNB_ID, choice.gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gNB_ID_constr_2, &asn_PER_memb_gNB_ID_constr_2, memb_gNB_ID_constraint_1 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_ENGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gNB-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1 = { + sizeof(struct ENGNB_ID), + offsetof(struct ENGNB_ID, _asn_ctx), + offsetof(struct ENGNB_ID, present), + sizeof(((struct ENGNB_ID *)0)->present), + asn_MAP_ENGNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_ENGNB_ID = { + "ENGNB-ID", + "ENGNB-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_ENGNB_ID_constr_1, &asn_PER_type_ENGNB_ID_constr_1, CHOICE_constraint }, + asn_MBR_ENGNB_ID_1, + 1, /* Elements count */ + &asn_SPC_ENGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ENGNB-ID.h b/src/codec_utils/E2AP_OLD1/ENGNB-ID.h new file mode 100644 index 000000000..13002af16 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ENGNB-ID.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ENGNB_ID_H_ +#define _ENGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ENGNB_ID_PR { + ENGNB_ID_PR_NOTHING, /* No components present */ + ENGNB_ID_PR_gNB_ID + /* Extensions may appear below */ + +} ENGNB_ID_PR; + +/* ENGNB-ID */ +typedef struct ENGNB_ID { + ENGNB_ID_PR present; + union ENGNB_ID_u { + BIT_STRING_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ENGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ENGNB_ID; +extern asn_CHOICE_specifics_t asn_SPC_ENGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_ENGNB_ID_1[1]; +extern asn_per_constraints_t asn_PER_type_ENGNB_ID_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _ENGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.c b/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.c new file mode 100644 index 000000000..027208428 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ErrorIndicationE2.h" + +asn_TYPE_member_t asn_MBR_ErrorIndicationE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P10, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ErrorIndicationE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ErrorIndicationE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_specs_1 = { + sizeof(struct ErrorIndicationE2), + offsetof(struct ErrorIndicationE2, _asn_ctx), + asn_MAP_ErrorIndicationE2_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2 = { + "ErrorIndicationE2", + "ErrorIndicationE2", + &asn_OP_SEQUENCE, + asn_DEF_ErrorIndicationE2_tags_1, + sizeof(asn_DEF_ErrorIndicationE2_tags_1) + /sizeof(asn_DEF_ErrorIndicationE2_tags_1[0]), /* 1 */ + asn_DEF_ErrorIndicationE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ErrorIndicationE2_tags_1) + /sizeof(asn_DEF_ErrorIndicationE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ErrorIndicationE2_1, + 1, /* Elements count */ + &asn_SPC_ErrorIndicationE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.h b/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.h new file mode 100644 index 000000000..8b752e23a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ErrorIndicationE2.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ErrorIndicationE2_H_ +#define _ErrorIndicationE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ErrorIndicationE2 */ +typedef struct ErrorIndicationE2 { + ProtocolIE_ContainerE2_1407P10_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ErrorIndicationE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_specs_1; +extern asn_TYPE_member_t asn_MBR_ErrorIndicationE2_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ErrorIndicationE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.c b/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.c new file mode 100644 index 000000000..8a017d742 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-CU-UP-ID.h" + +int +GNB_CU_UP_ID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_CU_UP_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID = { + "GNB-CU-UP-ID", + "GNB-CU-UP-ID", + &asn_OP_INTEGER, + asn_DEF_GNB_CU_UP_ID_tags_1, + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + asn_DEF_GNB_CU_UP_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_CU_UP_ID_tags_1) + /sizeof(asn_DEF_GNB_CU_UP_ID_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_CU_UP_ID_constr_1, &asn_PER_type_GNB_CU_UP_ID_constr_1, GNB_CU_UP_ID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.h b/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.h new file mode 100644 index 000000000..7bf479d90 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-CU-UP-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_CU_UP_ID_H_ +#define _GNB_CU_UP_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-CU-UP-ID */ +typedef INTEGER_t GNB_CU_UP_ID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_CU_UP_ID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_CU_UP_ID; +asn_struct_free_f GNB_CU_UP_ID_free; +asn_struct_print_f GNB_CU_UP_ID_print; +asn_constr_check_f GNB_CU_UP_ID_constraint; +ber_type_decoder_f GNB_CU_UP_ID_decode_ber; +der_type_encoder_f GNB_CU_UP_ID_encode_der; +xer_type_decoder_f GNB_CU_UP_ID_decode_xer; +xer_type_encoder_f GNB_CU_UP_ID_encode_xer; +oer_type_decoder_f GNB_CU_UP_ID_decode_oer; +oer_type_encoder_f GNB_CU_UP_ID_encode_oer; +per_type_decoder_f GNB_CU_UP_ID_decode_uper; +per_type_encoder_f GNB_CU_UP_ID_encode_uper; +per_type_decoder_f GNB_CU_UP_ID_decode_aper; +per_type_encoder_f GNB_CU_UP_ID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_CU_UP_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.c b/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.c new file mode 100644 index 000000000..52ec04099 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-DU-IDE2.h" + +int +GNB_DU_IDE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(asn_INTEGER2long(st, &value)) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value too large (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if((value >= 0 && value <= 68719476735)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using INTEGER, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_GNB_DU_IDE2_constr_1 CC_NOTUSED = { + { 8, 1 } /* (0..68719476735) */, + -1}; +asn_per_constraints_t asn_PER_type_GNB_DU_IDE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 36, -1, 0, 68719476735 } /* (0..68719476735) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_GNB_DU_IDE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_GNB_DU_IDE2 = { + "GNB-DU-IDE2", + "GNB-DU-IDE2", + &asn_OP_INTEGER, + asn_DEF_GNB_DU_IDE2_tags_1, + sizeof(asn_DEF_GNB_DU_IDE2_tags_1) + /sizeof(asn_DEF_GNB_DU_IDE2_tags_1[0]), /* 1 */ + asn_DEF_GNB_DU_IDE2_tags_1, /* Same as above */ + sizeof(asn_DEF_GNB_DU_IDE2_tags_1) + /sizeof(asn_DEF_GNB_DU_IDE2_tags_1[0]), /* 1 */ + { &asn_OER_type_GNB_DU_IDE2_constr_1, &asn_PER_type_GNB_DU_IDE2_constr_1, GNB_DU_IDE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.h b/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.h new file mode 100644 index 000000000..e190ee099 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-DU-IDE2.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_DU_IDE2_H_ +#define _GNB_DU_IDE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GNB-DU-IDE2 */ +typedef INTEGER_t GNB_DU_IDE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_GNB_DU_IDE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_GNB_DU_IDE2; +asn_struct_free_f GNB_DU_IDE2_free; +asn_struct_print_f GNB_DU_IDE2_print; +asn_constr_check_f GNB_DU_IDE2_constraint; +ber_type_decoder_f GNB_DU_IDE2_decode_ber; +der_type_encoder_f GNB_DU_IDE2_encode_der; +xer_type_decoder_f GNB_DU_IDE2_decode_xer; +xer_type_encoder_f GNB_DU_IDE2_encode_xer; +oer_type_decoder_f GNB_DU_IDE2_decode_oer; +oer_type_encoder_f GNB_DU_IDE2_encode_oer; +per_type_decoder_f GNB_DU_IDE2_decode_uper; +per_type_encoder_f GNB_DU_IDE2_encode_uper; +per_type_decoder_f GNB_DU_IDE2_decode_aper; +per_type_encoder_f GNB_DU_IDE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_DU_IDE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.c b/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.c new file mode 100644 index 000000000..a9284595e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GNB-ID-Choice.h" + +static int +memb_gnb_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size >= 22 && size <= 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(22..32)) */}; +static asn_per_constraints_t asn_PER_memb_gnb_ID_constr_2 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 22, 32 } /* (SIZE(22..32)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GNB_ID_Choice, choice.gnb_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_gnb_ID_constr_2, &asn_PER_memb_gnb_ID_constr_2, memb_gnb_ID_constraint_1 }, + 0, 0, /* No default value */ + "gnb-ID" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GNB_ID_Choice_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* gnb-ID */ +}; +asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1 = { + sizeof(struct GNB_ID_Choice), + offsetof(struct GNB_ID_Choice, _asn_ctx), + offsetof(struct GNB_ID_Choice, present), + sizeof(((struct GNB_ID_Choice *)0)->present), + asn_MAP_GNB_ID_Choice_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice = { + "GNB-ID-Choice", + "GNB-ID-Choice", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GNB_ID_Choice_constr_1, &asn_PER_type_GNB_ID_Choice_constr_1, CHOICE_constraint }, + asn_MBR_GNB_ID_Choice_1, + 1, /* Elements count */ + &asn_SPC_GNB_ID_Choice_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.h b/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.h new file mode 100644 index 000000000..ef1008775 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GNB-ID-Choice.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GNB_ID_Choice_H_ +#define _GNB_ID_Choice_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GNB_ID_Choice_PR { + GNB_ID_Choice_PR_NOTHING, /* No components present */ + GNB_ID_Choice_PR_gnb_ID + /* Extensions may appear below */ + +} GNB_ID_Choice_PR; + +/* GNB-ID-Choice */ +typedef struct GNB_ID_Choice { + GNB_ID_Choice_PR present; + union GNB_ID_Choice_u { + BIT_STRING_t gnb_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GNB_ID_Choice_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GNB_ID_Choice; +extern asn_CHOICE_specifics_t asn_SPC_GNB_ID_Choice_specs_1; +extern asn_TYPE_member_t asn_MBR_GNB_ID_Choice_1[1]; +extern asn_per_constraints_t asn_PER_type_GNB_ID_Choice_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _GNB_ID_Choice_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.c b/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.c new file mode 100644 index 000000000..3cfd04151 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.c @@ -0,0 +1,89 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-ID.h" + +#include "GlobalE2node-gNB-ID.h" +#include "GlobalE2node-en-gNB-ID.h" +#include "GlobalE2node-ng-eNB-ID.h" +#include "GlobalE2node-eNB-ID.h" +static asn_oer_constraints_t asn_OER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_GlobalE2node_ID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 3 } /* (0..3,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_GlobalE2node_ID_1[] = { + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.gNB), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.en_gNB), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_en_gNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "en-gNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.ng_eNB), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_ng_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ng-eNB" + }, + { ATF_POINTER, 0, offsetof(struct GlobalE2node_ID, choice.eNB), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalE2node_eNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* eNB */ +}; +static asn_CHOICE_specifics_t asn_SPC_GlobalE2node_ID_specs_1 = { + sizeof(struct GlobalE2node_ID), + offsetof(struct GlobalE2node_ID, _asn_ctx), + offsetof(struct GlobalE2node_ID, present), + sizeof(((struct GlobalE2node_ID *)0)->present), + asn_MAP_GlobalE2node_ID_tag2el_1, + 4, /* Count of tags in the map */ + 0, 0, + 4 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID = { + "GlobalE2node-ID", + "GlobalE2node-ID", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_GlobalE2node_ID_constr_1, &asn_PER_type_GlobalE2node_ID_constr_1, CHOICE_constraint }, + asn_MBR_GlobalE2node_ID_1, + 4, /* Elements count */ + &asn_SPC_GlobalE2node_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.h b/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.h new file mode 100644 index 000000000..0596af74f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-ID.h @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_ID_H_ +#define _GlobalE2node_ID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum GlobalE2node_ID_PR { + GlobalE2node_ID_PR_NOTHING, /* No components present */ + GlobalE2node_ID_PR_gNB, + GlobalE2node_ID_PR_en_gNB, + GlobalE2node_ID_PR_ng_eNB, + GlobalE2node_ID_PR_eNB + /* Extensions may appear below */ + +} GlobalE2node_ID_PR; + +/* Forward declarations */ +struct GlobalE2node_gNB_ID; +struct GlobalE2node_en_gNB_ID; +struct GlobalE2node_ng_eNB_ID; +struct GlobalE2node_eNB_ID; + +/* GlobalE2node-ID */ +typedef struct GlobalE2node_ID { + GlobalE2node_ID_PR present; + union GlobalE2node_ID_u { + struct GlobalE2node_gNB_ID *gNB; + struct GlobalE2node_en_gNB_ID *en_gNB; + struct GlobalE2node_ng_eNB_ID *ng_eNB; + struct GlobalE2node_eNB_ID *eNB; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ID; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.c new file mode 100644 index 000000000..2003c6c4a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_eNB_ID, global_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1 = { + sizeof(struct GlobalE2node_eNB_ID), + offsetof(struct GlobalE2node_eNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID = { + "GlobalE2node-eNB-ID", + "GlobalE2node-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.h new file mode 100644 index 000000000..dadf6db3e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_eNB_ID_H_ +#define _GlobalE2node_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-eNB-ID */ +typedef struct GlobalE2node_eNB_ID { + GlobalENB_ID_t global_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.c new file mode 100644 index 000000000..dc4a324b1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-en-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_en_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalenGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_en_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1 = { + sizeof(struct GlobalE2node_en_gNB_ID), + offsetof(struct GlobalE2node_en_gNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_en_gNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID = { + "GlobalE2node-en-gNB-ID", + "GlobalE2node-en-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_en_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_en_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_en_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_en_gNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_en_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.h new file mode 100644 index 000000000..ab6b6ff78 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-en-gNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_en_gNB_ID_H_ +#define _GlobalE2node_en_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalenGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-en-gNB-ID */ +typedef struct GlobalE2node_en_gNB_ID { + GlobalenGNB_ID_t global_gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_en_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_en_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_en_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_en_gNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_en_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.c new file mode 100644 index 000000000..fe1831520 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.c @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-gNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_gNB_ID, global_gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalgNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-gNB-ID" + }, + { ATF_POINTER, 2, offsetof(struct GlobalE2node_gNB_ID, gNB_CU_UP_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_CU_UP_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-CU-UP-ID" + }, + { ATF_POINTER, 1, offsetof(struct GlobalE2node_gNB_ID, gNB_DU_ID), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GNB_DU_IDE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-DU-ID" + }, +}; +static const int asn_MAP_GlobalE2node_gNB_ID_oms_1[] = { 1, 2 }; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_gNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_gNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* global-gNB-ID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gNB-CU-UP-ID */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* gNB-DU-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1 = { + sizeof(struct GlobalE2node_gNB_ID), + offsetof(struct GlobalE2node_gNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_gNB_ID_tag2el_1, + 3, /* Count of tags in the map */ + asn_MAP_GlobalE2node_gNB_ID_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID = { + "GlobalE2node-gNB-ID", + "GlobalE2node-gNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_gNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_gNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_gNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_gNB_ID_1, + 3, /* Elements count */ + &asn_SPC_GlobalE2node_gNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.h new file mode 100644 index 000000000..3eb603645 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-gNB-ID.h @@ -0,0 +1,48 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_gNB_ID_H_ +#define _GlobalE2node_gNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalgNB-ID.h" +#include "GNB-CU-UP-ID.h" +#include "GNB-DU-IDE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-gNB-ID */ +typedef struct GlobalE2node_gNB_ID { + GlobalgNB_ID_t global_gNB_ID; + GNB_CU_UP_ID_t *gNB_CU_UP_ID; /* OPTIONAL */ + GNB_DU_IDE2_t *gNB_DU_ID; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_gNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_gNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_gNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_gNB_ID_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_gNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.c new file mode 100644 index 000000000..2653a0001 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalE2node-ng-eNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalE2node_ng_eNB_ID, global_ng_eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_GlobalngeNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "global-ng-eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* global-ng-eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 = { + sizeof(struct GlobalE2node_ng_eNB_ID), + offsetof(struct GlobalE2node_ng_eNB_ID, _asn_ctx), + asn_MAP_GlobalE2node_ng_eNB_ID_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID = { + "GlobalE2node-ng-eNB-ID", + "GlobalE2node-ng-eNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalE2node_ng_eNB_ID_tags_1, + sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalE2node_ng_eNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1) + /sizeof(asn_DEF_GlobalE2node_ng_eNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalE2node_ng_eNB_ID_1, + 1, /* Elements count */ + &asn_SPC_GlobalE2node_ng_eNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.h new file mode 100644 index 000000000..93b0b6015 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalE2node-ng-eNB-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalE2node_ng_eNB_ID_H_ +#define _GlobalE2node_ng_eNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "GlobalngeNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalE2node-ng-eNB-ID */ +typedef struct GlobalE2node_ng_eNB_ID { + GlobalngeNB_ID_t global_ng_eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalE2node_ng_eNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalE2node_ng_eNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalE2node_ng_eNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalE2node_ng_eNB_ID_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalE2node_ng_eNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalENB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalENB-ID.c new file mode 100644 index 000000000..b0d89807e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalENB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalENB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID, eNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "eNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* eNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1 = { + sizeof(struct GlobalENB_ID), + offsetof(struct GlobalENB_ID, _asn_ctx), + asn_MAP_GlobalENB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID = { + "GlobalENB-ID", + "GlobalENB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalENB_ID_tags_1, + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalENB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalENB_ID_tags_1) + /sizeof(asn_DEF_GlobalENB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalENB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalENB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalENB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalENB-ID.h new file mode 100644 index 000000000..a9417954a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalENB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalENB_ID_H_ +#define _GlobalENB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalENB-ID */ +typedef struct GlobalENB_ID { + PLMN_IdentityE2_t pLMN_Identity; + ENB_ID_t eNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalENB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalENB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalENB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.c b/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.c new file mode 100644 index 000000000..245ec55ad --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.c @@ -0,0 +1,99 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalRIC-ID.h" + +static int +memb_ric_ID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + if(st->size > 0) { + /* Size in bits */ + size = 8 * st->size - (st->bits_unused & 0x07); + } else { + size = 0; + } + + if((size == 20)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_ric_ID_constr_3 CC_NOTUSED = { + { 0, 0 }, + 20 /* (SIZE(20..20)) */}; +static asn_per_constraints_t asn_PER_memb_ric_ID_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 20, 20 } /* (SIZE(20..20)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_GlobalRIC_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalRIC_ID, ric_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_BIT_STRING, + 0, + { &asn_OER_memb_ric_ID_constr_3, &asn_PER_memb_ric_ID_constr_3, memb_ric_ID_constraint_1 }, + 0, 0, /* No default value */ + "ric-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalRIC_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalRIC_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ric-ID */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_GlobalRIC_ID_specs_1 = { + sizeof(struct GlobalRIC_ID), + offsetof(struct GlobalRIC_ID, _asn_ctx), + asn_MAP_GlobalRIC_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID = { + "GlobalRIC-ID", + "GlobalRIC-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalRIC_ID_tags_1, + sizeof(asn_DEF_GlobalRIC_ID_tags_1) + /sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalRIC_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalRIC_ID_tags_1) + /sizeof(asn_DEF_GlobalRIC_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalRIC_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalRIC_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.h b/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.h new file mode 100644 index 000000000..43ef3672e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalRIC-ID.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalRIC_ID_H_ +#define _GlobalRIC_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalRIC-ID */ +typedef struct GlobalRIC_ID { + PLMN_IdentityE2_t pLMN_Identity; + BIT_STRING_t ric_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalRIC_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalRIC_ID; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalRIC_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.c new file mode 100644 index 000000000..57c4d227a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalenGNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, pLMN_Identity), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "pLMN-Identity" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalenGNB_ID, gNB_ID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENGNB_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gNB-ID" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalenGNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalenGNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMN-Identity */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gNB-ID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1 = { + sizeof(struct GlobalenGNB_ID), + offsetof(struct GlobalenGNB_ID, _asn_ctx), + asn_MAP_GlobalenGNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID = { + "GlobalenGNB-ID", + "GlobalenGNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalenGNB_ID_tags_1, + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalenGNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalenGNB_ID_tags_1) + /sizeof(asn_DEF_GlobalenGNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalenGNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalenGNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.h new file mode 100644 index 000000000..793d3992d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalenGNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalenGNB_ID_H_ +#define _GlobalenGNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENGNB-ID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalenGNB-ID */ +typedef struct GlobalenGNB_ID { + PLMN_IdentityE2_t pLMN_Identity; + ENGNB_ID_t gNB_ID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalenGNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalenGNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalenGNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalenGNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalenGNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.c new file mode 100644 index 000000000..d7f1ce6a9 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalgNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalgNB_ID, gnb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_GNB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "gnb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalgNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalgNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* gnb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1 = { + sizeof(struct GlobalgNB_ID), + offsetof(struct GlobalgNB_ID, _asn_ctx), + asn_MAP_GlobalgNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID = { + "GlobalgNB-ID", + "GlobalgNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalgNB_ID_tags_1, + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalgNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalgNB_ID_tags_1) + /sizeof(asn_DEF_GlobalgNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalgNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalgNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.h new file mode 100644 index 000000000..e3749a421 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalgNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalgNB_ID_H_ +#define _GlobalgNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "GNB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalgNB-ID */ +typedef struct GlobalgNB_ID { + PLMN_IdentityE2_t plmn_id; + GNB_ID_Choice_t gnb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalgNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalgNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalgNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalgNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalgNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.c b/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.c new file mode 100644 index 000000000..8b65d9738 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "GlobalngeNB-ID.h" + +asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, plmn_id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PLMN_IdentityE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "plmn-id" + }, + { ATF_NOFLAGS, 0, offsetof(struct GlobalngeNB_ID, enb_id), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_ENB_ID_Choice, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "enb-id" + }, +}; +static const ber_tlv_tag_t asn_DEF_GlobalngeNB_ID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_GlobalngeNB_ID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* plmn-id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* enb-id */ +}; +asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1 = { + sizeof(struct GlobalngeNB_ID), + offsetof(struct GlobalngeNB_ID, _asn_ctx), + asn_MAP_GlobalngeNB_ID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID = { + "GlobalngeNB-ID", + "GlobalngeNB-ID", + &asn_OP_SEQUENCE, + asn_DEF_GlobalngeNB_ID_tags_1, + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + asn_DEF_GlobalngeNB_ID_tags_1, /* Same as above */ + sizeof(asn_DEF_GlobalngeNB_ID_tags_1) + /sizeof(asn_DEF_GlobalngeNB_ID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_GlobalngeNB_ID_1, + 2, /* Elements count */ + &asn_SPC_GlobalngeNB_ID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.h b/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.h new file mode 100644 index 000000000..5ededc6d7 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/GlobalngeNB-ID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _GlobalngeNB_ID_H_ +#define _GlobalngeNB_ID_H_ + + +#include + +/* Including external dependencies */ +#include "PLMN-IdentityE2.h" +#include "ENB-ID-Choice.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* GlobalngeNB-ID */ +typedef struct GlobalngeNB_ID { + PLMN_IdentityE2_t plmn_id; + ENB_ID_Choice_t enb_id; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} GlobalngeNB_ID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_GlobalngeNB_ID; +extern asn_SEQUENCE_specifics_t asn_SPC_GlobalngeNB_ID_specs_1; +extern asn_TYPE_member_t asn_MBR_GlobalngeNB_ID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _GlobalngeNB_ID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.c b/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.c new file mode 100644 index 000000000..3f6985983 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.c @@ -0,0 +1,398 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "InitiatingMessageE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_InitiatingMessageE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessageE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_InitiatingMessageE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 0; /* &InitiatingMessageE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct InitiatingMessageE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICsubscriptionRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICsubscriptionDeleteRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICserviceUpdate), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdate, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdate" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICcontrolRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.E2setupRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.ResetRequest), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ResetRequest" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICindication), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICindication, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindication" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.RICserviceQuery), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceQuery, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceQuery" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2__value, choice.ErrorIndicationE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ErrorIndicationE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ErrorIndicationE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 8 }, /* RICsubscriptionRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 7 }, /* RICsubscriptionDeleteRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 6 }, /* RICserviceUpdate */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 5 }, /* RICcontrolRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 4 }, /* E2setupRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 3 }, /* ResetRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 6, -6, 2 }, /* RICindication */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 7, -7, 1 }, /* RICserviceQuery */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -8, 0 } /* ErrorIndicationE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct InitiatingMessageE2__value), + offsetof(struct InitiatingMessageE2__value, _asn_ctx), + offsetof(struct InitiatingMessageE2__value, present), + sizeof(((struct InitiatingMessageE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 9, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 9, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_InitiatingMessageE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_InitiatingMessageE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct InitiatingMessageE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_InitiatingMessageE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_InitiatingMessageE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_InitiatingMessageE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessageE2_specs_1 = { + sizeof(struct InitiatingMessageE2), + offsetof(struct InitiatingMessageE2, _asn_ctx), + asn_MAP_InitiatingMessageE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_InitiatingMessageE2 = { + "InitiatingMessageE2", + "InitiatingMessageE2", + &asn_OP_SEQUENCE, + asn_DEF_InitiatingMessageE2_tags_1, + sizeof(asn_DEF_InitiatingMessageE2_tags_1) + /sizeof(asn_DEF_InitiatingMessageE2_tags_1[0]), /* 1 */ + asn_DEF_InitiatingMessageE2_tags_1, /* Same as above */ + sizeof(asn_DEF_InitiatingMessageE2_tags_1) + /sizeof(asn_DEF_InitiatingMessageE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_InitiatingMessageE2_1, + 3, /* Elements count */ + &asn_SPC_InitiatingMessageE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.h b/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.h new file mode 100644 index 000000000..6d8baa4c3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/InitiatingMessageE2.h @@ -0,0 +1,97 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _InitiatingMessageE2_H_ +#define _InitiatingMessageE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum InitiatingMessageE2__value_PR { + InitiatingMessageE2__value_PR_NOTHING, /* No components present */ + InitiatingMessageE2__value_PR_RICsubscriptionRequest, + InitiatingMessageE2__value_PR_RICsubscriptionDeleteRequest, + InitiatingMessageE2__value_PR_RICserviceUpdate, + InitiatingMessageE2__value_PR_RICcontrolRequest, + InitiatingMessageE2__value_PR_E2setupRequest, + InitiatingMessageE2__value_PR_ResetRequest, + InitiatingMessageE2__value_PR_RICindication, + InitiatingMessageE2__value_PR_RICserviceQuery, + InitiatingMessageE2__value_PR_ErrorIndicationE2 +} InitiatingMessageE2__value_PR; + +/* InitiatingMessageE2 */ +typedef struct InitiatingMessageE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct InitiatingMessageE2__value { + InitiatingMessageE2__value_PR present; + union InitiatingMessageE2__value_u { + RICsubscriptionRequest_t RICsubscriptionRequest; + RICsubscriptionDeleteRequest_t RICsubscriptionDeleteRequest; + RICserviceUpdate_t RICserviceUpdate; + RICcontrolRequest_t RICcontrolRequest; + E2setupRequest_t E2setupRequest; + ResetRequest_t ResetRequest; + RICindication_t RICindication; + RICserviceQuery_t RICserviceQuery; + ErrorIndicationE2_t ErrorIndicationE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} InitiatingMessageE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_InitiatingMessageE2; +extern asn_SEQUENCE_specifics_t asn_SPC_InitiatingMessageE2_specs_1; +extern asn_TYPE_member_t asn_MBR_InitiatingMessageE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _InitiatingMessageE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/Makefile.am.libasncodec b/src/codec_utils/E2AP_OLD1/Makefile.am.libasncodec new file mode 100644 index 000000000..76d673614 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/Makefile.am.libasncodec @@ -0,0 +1,288 @@ +ASN_MODULE_SRCS= \ + ./out/E2AP-PDU.c \ + ./out/InitiatingMessageE2.c \ + ./out/SuccessfulOutcomeE2.c \ + ./out/UnsuccessfulOutcomeE2.c \ + ./out/RICsubscriptionRequest.c \ + ./out/RICsubscriptionDetails.c \ + ./out/RICactions-ToBeSetup-List.c \ + ./out/RICaction-ToBeSetup-Item.c \ + ./out/RICsubscriptionResponse.c \ + ./out/RICaction-Admitted-List.c \ + ./out/RICaction-Admitted-Item.c \ + ./out/RICaction-NotAdmitted-List.c \ + ./out/RICaction-NotAdmitted-Item.c \ + ./out/RICsubscriptionFailure.c \ + ./out/RICsubscriptionDeleteRequest.c \ + ./out/RICsubscriptionDeleteResponse.c \ + ./out/RICsubscriptionDeleteFailure.c \ + ./out/RICindication.c \ + ./out/RICcontrolRequest.c \ + ./out/RICcontrolAcknowledge.c \ + ./out/RICcontrolFailure.c \ + ./out/ErrorIndicationE2.c \ + ./out/E2setupRequest.c \ + ./out/E2setupResponse.c \ + ./out/E2setupFailure.c \ + ./out/ResetRequest.c \ + ./out/ResetResponse.c \ + ./out/RICserviceUpdate.c \ + ./out/RANfunctions-List.c \ + ./out/RANfunction-Item.c \ + ./out/RANfunctionsID-List.c \ + ./out/RANfunctionID-Item.c \ + ./out/RICserviceUpdateAcknowledge.c \ + ./out/RANfunctionsIDcause-List.c \ + ./out/RANfunctionIDcause-Item.c \ + ./out/RICserviceUpdateFailure.c \ + ./out/RICserviceQuery.c \ + ./out/CauseE2.c \ + ./out/CauseMisc.c \ + ./out/CauseProtocol.c \ + ./out/CauseRIC.c \ + ./out/CauseRICservice.c \ + ./out/CauseTransport.c \ + ./out/CriticalityDiagnosticsE2.c \ + ./out/CriticalityDiagnostics-IE-ListE2.c \ + ./out/CriticalityDiagnostics-IE-ItemE2.c \ + ./out/ENB-ID.c \ + ./out/ENB-ID-Choice.c \ + ./out/ENGNB-ID.c \ + ./out/GlobalE2node-ID.c \ + ./out/GlobalE2node-en-gNB-ID.c \ + ./out/GlobalE2node-eNB-ID.c \ + ./out/GlobalE2node-gNB-ID.c \ + ./out/GlobalE2node-ng-eNB-ID.c \ + ./out/GlobalENB-ID.c \ + ./out/GlobalenGNB-ID.c \ + ./out/GlobalgNB-ID.c \ + ./out/GlobalngeNB-ID.c \ + ./out/GlobalRIC-ID.c \ + ./out/GNB-CU-UP-ID.c \ + ./out/GNB-DU-IDE2.c \ + ./out/GNB-ID-Choice.c \ + ./out/PLMN-IdentityE2.c \ + ./out/RANfunctionDefinition.c \ + ./out/RANfunctionID.c \ + ./out/RANfunctionRevision.c \ + ./out/RICactionDefinition.c \ + ./out/RICactionID.c \ + ./out/RICactionType.c \ + ./out/RICcallProcessID.c \ + ./out/RICcontrolAckRequest.c \ + ./out/RICcontrolHeader.c \ + ./out/RICcontrolMessage.c \ + ./out/RICcontrolOutcome.c \ + ./out/RICcontrolStatus.c \ + ./out/RICeventTriggerDefinition.c \ + ./out/RICindicationHeader.c \ + ./out/RICindicationMessage.c \ + ./out/RICindicationSN.c \ + ./out/RICindicationType.c \ + ./out/RICrequestID.c \ + ./out/RICsubsequentAction.c \ + ./out/RICsubsequentActionType.c \ + ./out/RICtimeToWait.c \ + ./out/TimeToWaitE2.c \ + ./out/TypeOfErrorE2.c \ + ./out/CriticalityE2.c \ + ./out/PresenceE2.c \ + ./out/ProcedureCodeE2.c \ + ./out/ProtocolIE-IDE2.c \ + ./out/TriggeringMessageE2.c \ + ./out/ProtocolIE-ContainerE2.c \ + ./out/ProtocolIE-SingleContainerE2.c \ + ./out/ProtocolIE-FieldE2.c \ + ./out/ProtocolIE-ContainerPairE2.c \ + ./out/ProtocolIE-FieldPairE2.c \ + ./out/ProtocolIE-ContainerList.c \ + ./out/ProtocolIE-ContainerPairList.c + +ASN_MODULE_HDRS= \ + ./out/E2AP-PDU.h \ + ./out/InitiatingMessageE2.h \ + ./out/SuccessfulOutcomeE2.h \ + ./out/UnsuccessfulOutcomeE2.h \ + ./out/RICsubscriptionRequest.h \ + ./out/RICsubscriptionDetails.h \ + ./out/RICactions-ToBeSetup-List.h \ + ./out/RICaction-ToBeSetup-Item.h \ + ./out/RICsubscriptionResponse.h \ + ./out/RICaction-Admitted-List.h \ + ./out/RICaction-Admitted-Item.h \ + ./out/RICaction-NotAdmitted-List.h \ + ./out/RICaction-NotAdmitted-Item.h \ + ./out/RICsubscriptionFailure.h \ + ./out/RICsubscriptionDeleteRequest.h \ + ./out/RICsubscriptionDeleteResponse.h \ + ./out/RICsubscriptionDeleteFailure.h \ + ./out/RICindication.h \ + ./out/RICcontrolRequest.h \ + ./out/RICcontrolAcknowledge.h \ + ./out/RICcontrolFailure.h \ + ./out/ErrorIndicationE2.h \ + ./out/E2setupRequest.h \ + ./out/E2setupResponse.h \ + ./out/E2setupFailure.h \ + ./out/ResetRequest.h \ + ./out/ResetResponse.h \ + ./out/RICserviceUpdate.h \ + ./out/RANfunctions-List.h \ + ./out/RANfunction-Item.h \ + ./out/RANfunctionsID-List.h \ + ./out/RANfunctionID-Item.h \ + ./out/RICserviceUpdateAcknowledge.h \ + ./out/RANfunctionsIDcause-List.h \ + ./out/RANfunctionIDcause-Item.h \ + ./out/RICserviceUpdateFailure.h \ + ./out/RICserviceQuery.h \ + ./out/CauseE2.h \ + ./out/CauseMisc.h \ + ./out/CauseProtocol.h \ + ./out/CauseRIC.h \ + ./out/CauseRICservice.h \ + ./out/CauseTransport.h \ + ./out/CriticalityDiagnosticsE2.h \ + ./out/CriticalityDiagnostics-IE-ListE2.h \ + ./out/CriticalityDiagnostics-IE-ItemE2.h \ + ./out/ENB-ID.h \ + ./out/ENB-ID-Choice.h \ + ./out/ENGNB-ID.h \ + ./out/GlobalE2node-ID.h \ + ./out/GlobalE2node-en-gNB-ID.h \ + ./out/GlobalE2node-eNB-ID.h \ + ./out/GlobalE2node-gNB-ID.h \ + ./out/GlobalE2node-ng-eNB-ID.h \ + ./out/GlobalENB-ID.h \ + ./out/GlobalenGNB-ID.h \ + ./out/GlobalgNB-ID.h \ + ./out/GlobalngeNB-ID.h \ + ./out/GlobalRIC-ID.h \ + ./out/GNB-CU-UP-ID.h \ + ./out/GNB-DU-IDE2.h \ + ./out/GNB-ID-Choice.h \ + ./out/PLMN-IdentityE2.h \ + ./out/RANfunctionDefinition.h \ + ./out/RANfunctionID.h \ + ./out/RANfunctionRevision.h \ + ./out/RICactionDefinition.h \ + ./out/RICactionID.h \ + ./out/RICactionType.h \ + ./out/RICcallProcessID.h \ + ./out/RICcontrolAckRequest.h \ + ./out/RICcontrolHeader.h \ + ./out/RICcontrolMessage.h \ + ./out/RICcontrolOutcome.h \ + ./out/RICcontrolStatus.h \ + ./out/RICeventTriggerDefinition.h \ + ./out/RICindicationHeader.h \ + ./out/RICindicationMessage.h \ + ./out/RICindicationSN.h \ + ./out/RICindicationType.h \ + ./out/RICrequestID.h \ + ./out/RICsubsequentAction.h \ + ./out/RICsubsequentActionType.h \ + ./out/RICtimeToWait.h \ + ./out/TimeToWaitE2.h \ + ./out/TypeOfErrorE2.h \ + ./out/CriticalityE2.h \ + ./out/PresenceE2.h \ + ./out/ProcedureCodeE2.h \ + ./out/ProtocolIE-IDE2.h \ + ./out/TriggeringMessageE2.h \ + ./out/ProtocolIE-ContainerE2.h \ + ./out/ProtocolIE-SingleContainerE2.h \ + ./out/ProtocolIE-FieldE2.h \ + ./out/ProtocolIE-ContainerPairE2.h \ + ./out/ProtocolIE-FieldPairE2.h \ + ./out/ProtocolIE-ContainerList.h \ + ./out/ProtocolIE-ContainerPairList.h + +ASN_MODULE_HDRS+=./out/ANY.h +ASN_MODULE_SRCS+=./out/ANY.c +ASN_MODULE_HDRS+=./out/OCTET_STRING.h +ASN_MODULE_HDRS+=./out/OPEN_TYPE.h +ASN_MODULE_SRCS+=./out/OPEN_TYPE.c +ASN_MODULE_HDRS+=./out/constr_CHOICE.h +ASN_MODULE_HDRS+=./out/INTEGER.h +ASN_MODULE_SRCS+=./out/INTEGER.c +ASN_MODULE_HDRS+=./out/NativeEnumerated.h +ASN_MODULE_SRCS+=./out/NativeEnumerated.c +ASN_MODULE_HDRS+=./out/NativeInteger.h +ASN_MODULE_SRCS+=./out/NativeInteger.c +ASN_MODULE_HDRS+=./out/asn_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./out/asn_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./out/asn_SET_OF.h +ASN_MODULE_SRCS+=./out/asn_SET_OF.c +ASN_MODULE_SRCS+=./out/constr_CHOICE.c +ASN_MODULE_HDRS+=./out/constr_SEQUENCE.h +ASN_MODULE_SRCS+=./out/constr_SEQUENCE.c +ASN_MODULE_HDRS+=./out/constr_SEQUENCE_OF.h +ASN_MODULE_SRCS+=./out/constr_SEQUENCE_OF.c +ASN_MODULE_HDRS+=./out/constr_SET_OF.h +ASN_MODULE_SRCS+=./out/constr_SET_OF.c +ASN_MODULE_HDRS+=./out/asn_application.h +ASN_MODULE_SRCS+=./out/asn_application.c +ASN_MODULE_HDRS+=./out/asn_ioc.h +ASN_MODULE_HDRS+=./out/asn_system.h +ASN_MODULE_HDRS+=./out/asn_codecs.h +ASN_MODULE_HDRS+=./out/asn_internal.h +ASN_MODULE_SRCS+=./out/asn_internal.c +ASN_MODULE_HDRS+=./out/asn_random_fill.h +ASN_MODULE_SRCS+=./out/asn_random_fill.c +ASN_MODULE_HDRS+=./out/asn_bit_data.h +ASN_MODULE_SRCS+=./out/asn_bit_data.c +ASN_MODULE_SRCS+=./out/OCTET_STRING.c +ASN_MODULE_HDRS+=./out/BIT_STRING.h +ASN_MODULE_SRCS+=./out/BIT_STRING.c +ASN_MODULE_SRCS+=./out/asn_codecs_prim.c +ASN_MODULE_HDRS+=./out/asn_codecs_prim.h +ASN_MODULE_HDRS+=./out/ber_tlv_length.h +ASN_MODULE_SRCS+=./out/ber_tlv_length.c +ASN_MODULE_HDRS+=./out/ber_tlv_tag.h +ASN_MODULE_SRCS+=./out/ber_tlv_tag.c +ASN_MODULE_HDRS+=./out/ber_decoder.h +ASN_MODULE_SRCS+=./out/ber_decoder.c +ASN_MODULE_HDRS+=./out/der_encoder.h +ASN_MODULE_SRCS+=./out/der_encoder.c +ASN_MODULE_HDRS+=./out/constr_TYPE.h +ASN_MODULE_SRCS+=./out/constr_TYPE.c +ASN_MODULE_HDRS+=./out/constraints.h +ASN_MODULE_SRCS+=./out/constraints.c +ASN_MODULE_HDRS+=./out/xer_support.h +ASN_MODULE_SRCS+=./out/xer_support.c +ASN_MODULE_HDRS+=./out/xer_decoder.h +ASN_MODULE_SRCS+=./out/xer_decoder.c +ASN_MODULE_HDRS+=./out/xer_encoder.h +ASN_MODULE_SRCS+=./out/xer_encoder.c +ASN_MODULE_HDRS+=./out/per_support.h +ASN_MODULE_SRCS+=./out/per_support.c +ASN_MODULE_HDRS+=./out/per_decoder.h +ASN_MODULE_SRCS+=./out/per_decoder.c +ASN_MODULE_HDRS+=./out/per_encoder.h +ASN_MODULE_SRCS+=./out/per_encoder.c +ASN_MODULE_HDRS+=./out/per_opentype.h +ASN_MODULE_SRCS+=./out/per_opentype.c +ASN_MODULE_HDRS+=./out/oer_decoder.h +ASN_MODULE_HDRS+=./out/oer_encoder.h +ASN_MODULE_HDRS+=./out/oer_support.h +ASN_MODULE_SRCS+=./out/oer_decoder.c +ASN_MODULE_SRCS+=./out/oer_encoder.c +ASN_MODULE_SRCS+=./out/oer_support.c +ASN_MODULE_SRCS+=./out/OPEN_TYPE_oer.c +ASN_MODULE_SRCS+=./out/INTEGER_oer.c +ASN_MODULE_SRCS+=./out/BIT_STRING_oer.c +ASN_MODULE_SRCS+=./out/OCTET_STRING_oer.c +ASN_MODULE_SRCS+=./out/NativeInteger_oer.c +ASN_MODULE_SRCS+=./out/NativeEnumerated_oer.c +ASN_MODULE_SRCS+=./out/constr_CHOICE_oer.c +ASN_MODULE_SRCS+=./out/constr_SEQUENCE_oer.c +ASN_MODULE_SRCS+=./out/constr_SET_OF_oer.c + +ASN_MODULE_CFLAGS= + +lib_LTLIBRARIES+=libasncodec.la +libasncodec_la_SOURCES=$(ASN_MODULE_SRCS) $(ASN_MODULE_HDRS) +libasncodec_la_CPPFLAGS=-I$(top_srcdir)/./out/ +libasncodec_la_CFLAGS=$(ASN_MODULE_CFLAGS) +libasncodec_la_LDFLAGS=-lm diff --git a/src/codec_utils/E2AP_OLD1/NativeEnumerated.c b/src/codec_utils/E2AP_OLD1/NativeEnumerated.c new file mode 100644 index 000000000..50ffb1d78 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeEnumerated.c @@ -0,0 +1,367 @@ +/*- + * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeEnumerated basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeEnumerated = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeEnumerated_decode_oer, + NativeEnumerated_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, + NativeEnumerated_decode_aper, + NativeEnumerated_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeEnumerated_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { + "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + "ENUMERATED", + &asn_OP_NativeEnumerated, + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +asn_enc_rval_t +NativeEnumerated_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + const asn_INTEGER_enum_map_t *el; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + el = INTEGER_map_value2enum(specs, *native); + if(el) { + er.encoded = + asn__format_to_callback(cb, app_key, "<%s/>", el->enum_name); + if(er.encoded < 0) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } else { + ASN_DEBUG( + "ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +NativeEnumerated_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +static int +NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { + const asn_INTEGER_enum_map_t *a = ap; + const asn_INTEGER_enum_map_t *b = bp; + if(a->nat_value == b->nat_value) + return 0; + if(a->nat_value < b->nat_value) + return -1; + return 1; +} + +asn_enc_rval_t +NativeEnumerated_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + const asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +NativeEnumerated_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + const asn_per_constraint_t *ct = NULL; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + /* Deal with APER padding */ + if(ct && ct->upper_bound >= 255) { + int padding = 0; + padding = (8 - (pd->moved % 8)) % 8; + ASN_DEBUG("For NativeEnumerated %s,offset= %lu Padding bits = %d", td->name, pd->moved, padding); + ASN_DEBUG("For NativeEnumerated %s, upper bound = %lu", td->name, ct->upper_bound); + if(padding > 0) + per_get_few_bits(pd, padding); + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +asn_enc_rval_t +NativeEnumerated_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native, value; + const asn_per_constraint_t *ct = NULL; + int inext = 0; + asn_INTEGER_enum_map_t key; + asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(const long *)sptr; + if(native < 0) ASN__ENCODE_FAILED; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct && ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct && ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} diff --git a/src/codec_utils/E2AP_OLD1/NativeEnumerated.h b/src/codec_utils/E2AP_OLD1/NativeEnumerated.h new file mode 100644 index 000000000..459f0e633 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeEnumerated.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard ENUMERATED in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeEnumerated_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeEnumerated_H_ +#define _NativeEnumerated_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; +extern asn_TYPE_operation_t asn_OP_NativeEnumerated; + +xer_type_encoder_f NativeEnumerated_encode_xer; +oer_type_decoder_f NativeEnumerated_decode_oer; +oer_type_encoder_f NativeEnumerated_encode_oer; +per_type_decoder_f NativeEnumerated_decode_uper; +per_type_encoder_f NativeEnumerated_encode_uper; +per_type_decoder_f NativeEnumerated_decode_aper; +per_type_encoder_f NativeEnumerated_encode_aper; + +#define NativeEnumerated_free NativeInteger_free +#define NativeEnumerated_print NativeInteger_print +#define NativeEnumerated_compare NativeInteger_compare +#define NativeEnumerated_random_fill NativeInteger_random_fill +#define NativeEnumerated_constraint asn_generic_no_constraint +#define NativeEnumerated_decode_ber NativeInteger_decode_ber +#define NativeEnumerated_encode_der NativeInteger_encode_der +#define NativeEnumerated_decode_xer NativeInteger_decode_xer + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeEnumerated_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/NativeEnumerated_oer.c b/src/codec_utils/E2AP_OLD1/NativeEnumerated_oer.c new file mode 100644 index 000000000..ee3c1895e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeEnumerated_oer.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +static long +asn__nativeenumerated_convert(const uint8_t *b, const uint8_t *end) { + unsigned long value; + + /* Perform the sign initialization */ + /* Actually value = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) { + value = (unsigned long)(-1); + } else { + value = 0; + } + + /* Conversion engine */ + for(; b < end; b++) { + value = (value << 8) | *b; + } + + return value; +} + +asn_dec_rval_t +NativeEnumerated_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + const uint8_t *b = ptr; + + (void)opt_codec_ctx; + (void)constraints; + + if(size < 1) { + ASN__DECODE_STARVED; + } + + if((*b & 0x80) == 0) { + /* + * X.696 (08/2015) #11.2 Short form for Enumerated. + */ + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = *b; + rval.consumed = 1; + } else { + /* + * X.696 (08/2015) #11.4 Long form for Enumerated. + */ + size_t length = *b & 0x7f; + const uint8_t *bend; + long value; + + if(length < 1 || length > sizeof(*native)) { + ASN__DECODE_FAILED; + } + if((1 + length) > size) { + ASN__DECODE_STARVED; + } + b++; + bend = b + length; + + value = asn__nativeenumerated_convert(b, bend); + if(value < 0) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + ASN__DECODE_FAILED; + } + } + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + *native = value; + + rval.consumed = (1 + length); + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeEnumerated_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + long native; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + if(native >= 0 && native <= 127) { + /* #11.2 Short form */ + uint8_t b = native; + er.encoded = 1; + if(cb(&b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } else { + /* #11.2 Long form */ + uint8_t buf[1 + sizeof(native)]; + uint8_t *b = &buf[sizeof(native)]; /* Last addressable */ + long final_pattern = -1 * (native < 0); + + for(;;) { + *b-- = native; + native >>= 8; + if(native == final_pattern) { + if(final_pattern) { + if((b[1] & 0x80)) break; + } else { + if(!(b[1] & 0x80)) break; + } + } + } + *b = 0x80 | (&buf[sizeof(native)] - b); + er.encoded = 1 + (&buf[sizeof(native)] - b); + if(cb(b, er.encoded, app_key) < 0) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_OLD1/NativeInteger.c b/src/codec_utils/E2AP_OLD1/NativeInteger.c new file mode 100644 index 000000000..316e8720a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeInteger.c @@ -0,0 +1,550 @@ +/*- + * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeInteger basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_operation_t asn_OP_NativeInteger = { + NativeInteger_free, + NativeInteger_print, + NativeInteger_compare, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeInteger_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + NativeInteger_decode_oer, /* OER decoder */ + NativeInteger_encode_oer, /* Canonical OER encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ + NativeInteger_decode_aper, /* Aligned PER decoder */ + NativeInteger_encode_aper, /* Aligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + NativeInteger_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; +asn_TYPE_descriptor_t asn_DEF_NativeInteger = { + "INTEGER", /* The ASN.1 type is still INTEGER */ + "INTEGER", + &asn_OP_NativeInteger, + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + { 0, 0, asn_generic_no_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Decode INTEGER type. + */ +asn_dec_rval_t +NativeInteger_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **nint_ptr, + const void *buf_ptr, size_t size, int tag_mode) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + long *native = (long *)*nint_ptr; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(native == NULL) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(native == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded INTEGER: buf_ptr, length + * Fill the native, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + long l; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; + tmp.size = length; + + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *native = l; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", + (long)rval.consumed, (long)length, td->name, (long)*native); + + return rval; +} + +/* + * Encode the NativeInteger using the standard INTEGER type DER encoder. + */ +asn_enc_rval_t +NativeInteger_encode_der(const asn_TYPE_descriptor_t *sd, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned long native = *(const unsigned long *)ptr; /* Disable sign ext. */ + asn_enc_rval_t erval = {0,0,0}; + INTEGER_t tmp; + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + + tmp.buf = (uint8_t *)&native; + tmp.size = sizeof(native); + +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ + uint8_t buf[sizeof(native)]; + uint8_t *p; + + /* Prepare a fake INTEGER */ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) + *p = (uint8_t)native; + + tmp.buf = buf; + tmp.size = sizeof(buf); +#endif /* WORDS_BIGENDIAN */ + + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.structure_ptr == &tmp) { + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +asn_dec_rval_t +NativeInteger_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, + size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + INTEGER_t st; + void *st_ptr = (void *)&st; + long *native = (long *)*sptr; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&st, 0, sizeof(st)); + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + opt_mname, buf_ptr, size); + if(rval.code == RC_OK) { + long l; + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&st, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&st, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } else { + *native = l; + } + } else { + /* + * Cannot restart from the middle; + * there is no place to save state in the native type. + * Request a continuation from the very beginning. + */ + rval.consumed = 0; + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); + return rval; +} + + +asn_enc_rval_t +NativeInteger_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; /* Enough for 64-bit int */ + asn_enc_rval_t er = {0,0,0}; + const long *native = (const long *)sptr; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + er.encoded = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); + if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) + || cb(scratch, er.encoded, app_key) < 0) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +NativeInteger_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_uper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +asn_dec_rval_t +NativeInteger_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (APER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_aper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + + const asn_INTEGER_specifics_t *specs = (const asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (APER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, (unsigned long)native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_aper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +/* + * INTEGER specific human-readable output. + */ +int +NativeInteger_print(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + const long *native = (const long *)sptr; + char scratch[32]; /* Enough for 64-bit int */ + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(native) { + long value = *native; + ret = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) ? "%lu" : "%ld", value); + assert(ret > 0 && (size_t)ret < sizeof(scratch)); + if(cb(scratch, ret, app_key) < 0) return -1; + if(specs && (value >= 0 || !specs->field_unsigned)) { + const asn_INTEGER_enum_map_t *el = + INTEGER_map_value2enum(specs, value); + if(el) { + if(cb(" (", 2, app_key) < 0) return -1; + if(cb(el->enum_name, el->enum_len, app_key) < 0) return -1; + if(cb(")", 1, app_key) < 0) return -1; + } + } + return 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +NativeInteger_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", + td->name, method, ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, sizeof(long)); + break; + } +} + +int +NativeInteger_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + (void)td; + + if(aptr && bptr) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + if(specs && specs->field_unsigned) { + const unsigned long *a = aptr; + const unsigned long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } else { + const long *a = aptr; + const long *b = bptr; + if(*a < *b) { + return -1; + } else if(*a > *b) { + return 1; + } else { + return 0; + } + } + } else if(!aptr) { + return -1; + } else { + return 1; + } +} + +asn_random_fill_result_t +NativeInteger_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 1}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + long *st = *sptr; + const asn_INTEGER_enum_map_t *emap; + size_t emap_len; + intmax_t value; + int find_inside_map; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (long *)CALLOC(1, sizeof(*st)); + if(st == NULL) { + return result_failed; + } + } + + if(specs) { + emap = specs->value2enum; + emap_len = specs->map_count; + if(specs->strict_enumeration) { + find_inside_map = emap_len > 0; + } else { + find_inside_map = emap_len ? asn_random_between(0, 1) : 0; + } + } else { + emap = 0; + emap_len = 0; + find_inside_map = 0; + } + + if(find_inside_map) { + assert(emap_len > 0); + value = emap[asn_random_between(0, emap_len - 1)].nat_value; + } else { + const asn_per_constraints_t *ct; + + static const long variants[] = { + -65536, -65535, -65534, -32769, -32768, -32767, -16385, -16384, + -16383, -257, -256, -255, -254, -129, -128, -127, + -126, -1, 0, 1, 126, 127, 128, 129, + 254, 255, 256, 257, 16383, 16384, 16385, 32767, + 32768, 32769, 65534, 65535, 65536, 65537}; + if(specs && specs->field_unsigned) { + assert(variants[18] == 0); + value = variants[asn_random_between( + 18, sizeof(variants) / sizeof(variants[0]) - 1)]; + } else { + value = variants[asn_random_between( + 0, sizeof(variants) / sizeof(variants[0]) - 1)]; + } + + if(!constraints) constraints = &td->encoding_constraints; + ct = constraints ? constraints->per_constraints : 0; + if(ct && (ct->value.flags & APC_CONSTRAINED)) { + if(value < ct->value.lower_bound || value > ct->value.upper_bound) { + value = asn_random_between(ct->value.lower_bound, + ct->value.upper_bound); + } + } + } + + *sptr = st; + *st = value; + return result_ok; +} diff --git a/src/codec_utils/E2AP_OLD1/NativeInteger.h b/src/codec_utils/E2AP_OLD1/NativeInteger.h new file mode 100644 index 000000000..c74406a8a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeInteger.h @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard INTEGER in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeInteger_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeInteger_H_ +#define _NativeInteger_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; +extern asn_TYPE_operation_t asn_OP_NativeInteger; + +asn_struct_free_f NativeInteger_free; +asn_struct_print_f NativeInteger_print; +asn_struct_compare_f NativeInteger_compare; +ber_type_decoder_f NativeInteger_decode_ber; +der_type_encoder_f NativeInteger_encode_der; +xer_type_decoder_f NativeInteger_decode_xer; +xer_type_encoder_f NativeInteger_encode_xer; +oer_type_decoder_f NativeInteger_decode_oer; +oer_type_encoder_f NativeInteger_encode_oer; +per_type_decoder_f NativeInteger_decode_uper; +per_type_encoder_f NativeInteger_encode_uper; +per_type_decoder_f NativeInteger_decode_aper; +per_type_encoder_f NativeInteger_encode_aper; +asn_random_fill_f NativeInteger_random_fill; + +#define NativeInteger_constraint asn_generic_no_constraint + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeInteger_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/NativeInteger_oer.c b/src/codec_utils/E2AP_OLD1/NativeInteger_oer.c new file mode 100644 index 000000000..411413a24 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/NativeInteger_oer.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +asn_dec_rval_t +NativeInteger_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + void **nint_ptr, const void *ptr, size_t size) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + long *native = (long *)*nint_ptr; + INTEGER_t tmpint; + INTEGER_t *tmpintptr = &tmpint; + + memset(&tmpint, 0, sizeof(tmpint)); + + if(!native) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + /* + * OPTIMIZATION: Encode directly rather than passing through INTEGER. + * Saves a memory allocation. + */ + rval = INTEGER_decode_oer(opt_codec_ctx, td, constraints, + (void **)&tmpintptr, ptr, size); + if(rval.code != RC_OK) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return rval; + } + + if(specs && specs->field_unsigned) { + unsigned long ul; + int ok = asn_INTEGER2ulong(&tmpint, &ul) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = ul; + } else { + rval.code = RC_FAIL; + return rval; + } + } else { + long l; + int ok = asn_INTEGER2long(&tmpint, &l) == 0; + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + if(ok) { + *native = l; + } else { + rval.code = RC_FAIL; + return rval; + } + } + + return rval; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +NativeInteger_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, + const void *sptr, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_INTEGER_specifics_t *specs = + (const asn_INTEGER_specifics_t *)td->specifics; + INTEGER_t tmpint; + long native; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(const long *)sptr; + memset(&tmpint, 0, sizeof(tmpint)); + + ASN_DEBUG("Encoding %s %ld as NativeInteger", td ? td->name : "", native); + + if((specs && specs->field_unsigned) ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) { + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t er = + INTEGER_encode_oer(td, constraints, &tmpint, cb, app_key); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.c b/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.c new file mode 100644 index 000000000..800a2163a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.c @@ -0,0 +1,65 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PLMN-IdentityE2.h" + +int +PLMN_IdentityE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 3)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_PLMN_IdentityE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + 3 /* (SIZE(3..3)) */}; +asn_per_constraints_t asn_PER_type_PLMN_IdentityE2_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 0, 0, 3, 3 } /* (SIZE(3..3)) */, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_PLMN_IdentityE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_PLMN_IdentityE2 = { + "PLMN-IdentityE2", + "PLMN-IdentityE2", + &asn_OP_OCTET_STRING, + asn_DEF_PLMN_IdentityE2_tags_1, + sizeof(asn_DEF_PLMN_IdentityE2_tags_1) + /sizeof(asn_DEF_PLMN_IdentityE2_tags_1[0]), /* 1 */ + asn_DEF_PLMN_IdentityE2_tags_1, /* Same as above */ + sizeof(asn_DEF_PLMN_IdentityE2_tags_1) + /sizeof(asn_DEF_PLMN_IdentityE2_tags_1[0]), /* 1 */ + { &asn_OER_type_PLMN_IdentityE2_constr_1, &asn_PER_type_PLMN_IdentityE2_constr_1, PLMN_IdentityE2_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.h b/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.h new file mode 100644 index 000000000..44d0cd2c6 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/PLMN-IdentityE2.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PLMN_IdentityE2_H_ +#define _PLMN_IdentityE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PLMN-IdentityE2 */ +typedef OCTET_STRING_t PLMN_IdentityE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_PLMN_IdentityE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_PLMN_IdentityE2; +asn_struct_free_f PLMN_IdentityE2_free; +asn_struct_print_f PLMN_IdentityE2_print; +asn_constr_check_f PLMN_IdentityE2_constraint; +ber_type_decoder_f PLMN_IdentityE2_decode_ber; +der_type_encoder_f PLMN_IdentityE2_encode_der; +xer_type_decoder_f PLMN_IdentityE2_decode_xer; +xer_type_encoder_f PLMN_IdentityE2_encode_xer; +oer_type_decoder_f PLMN_IdentityE2_decode_oer; +oer_type_encoder_f PLMN_IdentityE2_encode_oer; +per_type_decoder_f PLMN_IdentityE2_decode_uper; +per_type_encoder_f PLMN_IdentityE2_encode_uper; +per_type_decoder_f PLMN_IdentityE2_decode_aper; +per_type_encoder_f PLMN_IdentityE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _PLMN_IdentityE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/PresenceE2.c b/src/codec_utils/E2AP_OLD1/PresenceE2.c new file mode 100644 index 000000000..9ce3b2b91 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/PresenceE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "PresenceE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_PresenceE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_PresenceE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_PresenceE2_value2enum_1[] = { + { 0, 8, "optional" }, + { 1, 11, "conditional" }, + { 2, 9, "mandatory" } +}; +static const unsigned int asn_MAP_PresenceE2_enum2value_1[] = { + 1, /* conditional(1) */ + 2, /* mandatory(2) */ + 0 /* optional(0) */ +}; +const asn_INTEGER_specifics_t asn_SPC_PresenceE2_specs_1 = { + asn_MAP_PresenceE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_PresenceE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_PresenceE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_PresenceE2 = { + "PresenceE2", + "PresenceE2", + &asn_OP_NativeEnumerated, + asn_DEF_PresenceE2_tags_1, + sizeof(asn_DEF_PresenceE2_tags_1) + /sizeof(asn_DEF_PresenceE2_tags_1[0]), /* 1 */ + asn_DEF_PresenceE2_tags_1, /* Same as above */ + sizeof(asn_DEF_PresenceE2_tags_1) + /sizeof(asn_DEF_PresenceE2_tags_1[0]), /* 1 */ + { &asn_OER_type_PresenceE2_constr_1, &asn_PER_type_PresenceE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_PresenceE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/PresenceE2.h b/src/codec_utils/E2AP_OLD1/PresenceE2.h new file mode 100644 index 000000000..8ab9ca2d6 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/PresenceE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _PresenceE2_H_ +#define _PresenceE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum PresenceE2 { + PresenceE2_optional = 0, + PresenceE2_conditional = 1, + PresenceE2_mandatory = 2 +} e_PresenceE2; + +/* PresenceE2 */ +typedef long PresenceE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_PresenceE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_PresenceE2; +extern const asn_INTEGER_specifics_t asn_SPC_PresenceE2_specs_1; +asn_struct_free_f PresenceE2_free; +asn_struct_print_f PresenceE2_print; +asn_constr_check_f PresenceE2_constraint; +ber_type_decoder_f PresenceE2_decode_ber; +der_type_encoder_f PresenceE2_encode_der; +xer_type_decoder_f PresenceE2_decode_xer; +xer_type_encoder_f PresenceE2_encode_xer; +oer_type_decoder_f PresenceE2_decode_oer; +oer_type_encoder_f PresenceE2_encode_oer; +per_type_decoder_f PresenceE2_decode_uper; +per_type_encoder_f PresenceE2_encode_uper; +per_type_decoder_f PresenceE2_decode_aper; +per_type_encoder_f PresenceE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _PresenceE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.c b/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.c new file mode 100644 index 000000000..a9335b871 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProcedureCodeE2.h" + +int +ProcedureCodeE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_ProcedureCodeE2_constr_1 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +asn_per_constraints_t asn_PER_type_ProcedureCodeE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_ProcedureCodeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProcedureCodeE2 = { + "ProcedureCodeE2", + "ProcedureCodeE2", + &asn_OP_NativeInteger, + asn_DEF_ProcedureCodeE2_tags_1, + sizeof(asn_DEF_ProcedureCodeE2_tags_1) + /sizeof(asn_DEF_ProcedureCodeE2_tags_1[0]), /* 1 */ + asn_DEF_ProcedureCodeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ProcedureCodeE2_tags_1) + /sizeof(asn_DEF_ProcedureCodeE2_tags_1[0]), /* 1 */ + { &asn_OER_type_ProcedureCodeE2_constr_1, &asn_PER_type_ProcedureCodeE2_constr_1, ProcedureCodeE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.h b/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.h new file mode 100644 index 000000000..bf85b9ba1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProcedureCodeE2.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProcedureCodeE2_H_ +#define _ProcedureCodeE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProcedureCodeE2 */ +typedef long ProcedureCodeE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_ProcedureCodeE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProcedureCodeE2; +asn_struct_free_f ProcedureCodeE2_free; +asn_struct_print_f ProcedureCodeE2_print; +asn_constr_check_f ProcedureCodeE2_constraint; +ber_type_decoder_f ProcedureCodeE2_decode_ber; +der_type_encoder_f ProcedureCodeE2_encode_der; +xer_type_decoder_f ProcedureCodeE2_decode_xer; +xer_type_encoder_f ProcedureCodeE2_encode_xer; +oer_type_decoder_f ProcedureCodeE2_decode_oer; +oer_type_encoder_f ProcedureCodeE2_encode_oer; +per_type_decoder_f ProcedureCodeE2_decode_uper; +per_type_encoder_f ProcedureCodeE2_encode_uper; +per_type_decoder_f ProcedureCodeE2_decode_aper; +per_type_encoder_f ProcedureCodeE2_encode_aper; +#define ProcedureCodeE2_id_E2setup ((ProcedureCodeE2_t)1) +#define ProcedureCodeE2_id_ErrorIndicationE2 ((ProcedureCodeE2_t)2) +#define ProcedureCodeE2_id_Reset ((ProcedureCodeE2_t)3) +#define ProcedureCodeE2_id_RICcontrol ((ProcedureCodeE2_t)4) +#define ProcedureCodeE2_id_RICindication ((ProcedureCodeE2_t)5) +#define ProcedureCodeE2_id_RICserviceQuery ((ProcedureCodeE2_t)6) +#define ProcedureCodeE2_id_RICserviceUpdate ((ProcedureCodeE2_t)7) +#define ProcedureCodeE2_id_RICsubscription ((ProcedureCodeE2_t)8) +#define ProcedureCodeE2_id_RICsubscriptionDelete ((ProcedureCodeE2_t)9) + +#ifdef __cplusplus +} +#endif + +#endif /* _ProcedureCodeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.c new file mode 100644 index 000000000..3c6446b8d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.c @@ -0,0 +1,870 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerE2.h" + +#include "ProtocolIE-FieldE2.h" +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..65535)) */}; +asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (SIZE(0..65535)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 = { + sizeof(struct ProtocolIE_ContainerE2_1407P0), + offsetof(struct ProtocolIE_ContainerE2_1407P0, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P0_tags_1[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P0_constr_1, &asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P0_1, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionResponse_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 = { + sizeof(struct ProtocolIE_ContainerE2_1407P1), + offsetof(struct ProtocolIE_ContainerE2_1407P1, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P1_tags_3[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P1_constr_3, &asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P1_3, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 = { + sizeof(struct ProtocolIE_ContainerE2_1407P2), + offsetof(struct ProtocolIE_ContainerE2_1407P2, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P2_tags_5[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P2_constr_5, &asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P2_5, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 = { + sizeof(struct ProtocolIE_ContainerE2_1407P3), + offsetof(struct ProtocolIE_ContainerE2_1407P3, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P3_tags_7[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P3_constr_7, &asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P3_7, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteResponse_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 = { + sizeof(struct ProtocolIE_ContainerE2_1407P4), + offsetof(struct ProtocolIE_ContainerE2_1407P4, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P4_tags_9[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P4_constr_9, &asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P4_9, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 = { + sizeof(struct ProtocolIE_ContainerE2_1407P5), + offsetof(struct ProtocolIE_ContainerE2_1407P5, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P5_tags_11[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P5_constr_11, &asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P5_11, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICindication_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 = { + sizeof(struct ProtocolIE_ContainerE2_1407P6), + offsetof(struct ProtocolIE_ContainerE2_1407P6, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P6_tags_13[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P6_constr_13, &asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P6_13, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolRequest_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 = { + sizeof(struct ProtocolIE_ContainerE2_1407P7), + offsetof(struct ProtocolIE_ContainerE2_1407P7, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P7_tags_15[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P7_constr_15, &asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P7_15, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolAcknowledge_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 = { + sizeof(struct ProtocolIE_ContainerE2_1407P8), + offsetof(struct ProtocolIE_ContainerE2_1407P8, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P8_tags_17[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P8_constr_17, &asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P8_17, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 = { + sizeof(struct ProtocolIE_ContainerE2_1407P9), + offsetof(struct ProtocolIE_ContainerE2_1407P9, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P9_tags_19[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P9_constr_19, &asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P9_19, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ErrorIndicationE2_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 = { + sizeof(struct ProtocolIE_ContainerE2_1407P10), + offsetof(struct ProtocolIE_ContainerE2_1407P10, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P10_tags_21[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P10_constr_21, &asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P10_21, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupRequestIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 = { + sizeof(struct ProtocolIE_ContainerE2_1407P11), + offsetof(struct ProtocolIE_ContainerE2_1407P11, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P11_tags_23[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P11_constr_23, &asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P11_23, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupResponseIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 = { + sizeof(struct ProtocolIE_ContainerE2_1407P12), + offsetof(struct ProtocolIE_ContainerE2_1407P12, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P12_tags_25[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P12_constr_25, &asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P12_25, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupFailureIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 = { + sizeof(struct ProtocolIE_ContainerE2_1407P13), + offsetof(struct ProtocolIE_ContainerE2_1407P13, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P13_tags_27[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P13_constr_27, &asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P13_27, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetRequestIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 = { + sizeof(struct ProtocolIE_ContainerE2_1407P14), + offsetof(struct ProtocolIE_ContainerE2_1407P14, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P14_tags_29[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P14_constr_29, &asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P14_29, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetResponseIEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 = { + sizeof(struct ProtocolIE_ContainerE2_1407P15), + offsetof(struct ProtocolIE_ContainerE2_1407P15, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P15_tags_31[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P15_constr_31, &asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P15_31, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdate_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 = { + sizeof(struct ProtocolIE_ContainerE2_1407P16), + offsetof(struct ProtocolIE_ContainerE2_1407P16, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P16_tags_33[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P16_constr_33, &asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P16_33, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateAcknowledge_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 = { + sizeof(struct ProtocolIE_ContainerE2_1407P17), + offsetof(struct ProtocolIE_ContainerE2_1407P17, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P17_tags_35[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P17_constr_35, &asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P17_35, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateFailure_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 = { + sizeof(struct ProtocolIE_ContainerE2_1407P18), + offsetof(struct ProtocolIE_ContainerE2_1407P18, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P18_tags_37[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P18_constr_37, &asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P18_37, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceQuery_IEs, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 = { + sizeof(struct ProtocolIE_ContainerE2_1407P19), + offsetof(struct ProtocolIE_ContainerE2_1407P19, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19 = { + "ProtocolIE-ContainerE2", + "ProtocolIE-ContainerE2", + &asn_OP_SEQUENCE_OF, + asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ + asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39) + /sizeof(asn_DEF_ProtocolIE_ContainerE2_1407P19_tags_39[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_ContainerE2_1407P19_constr_39, &asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39, SEQUENCE_OF_constraint }, + asn_MBR_ProtocolIE_ContainerE2_1407P19_39, + 1, /* Single element */ + &asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.h new file mode 100644 index 000000000..7da7246c9 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerE2.h @@ -0,0 +1,253 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerE2_H_ +#define _ProtocolIE_ContainerE2_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICsubscriptionRequest_IEs; +struct RICsubscriptionResponse_IEs; +struct RICsubscriptionFailure_IEs; +struct RICsubscriptionDeleteRequest_IEs; +struct RICsubscriptionDeleteResponse_IEs; +struct RICsubscriptionDeleteFailure_IEs; +struct RICindication_IEs; +struct RICcontrolRequest_IEs; +struct RICcontrolAcknowledge_IEs; +struct RICcontrolFailure_IEs; +struct ErrorIndicationE2_IEs; +struct E2setupRequestIEs; +struct E2setupResponseIEs; +struct E2setupFailureIEs; +struct ResetRequestIEs; +struct ResetResponseIEs; +struct RICserviceUpdate_IEs; +struct RICserviceUpdateAcknowledge_IEs; +struct RICserviceUpdateFailure_IEs; +struct RICserviceQuery_IEs; + +/* ProtocolIE-ContainerE2 */ +typedef struct ProtocolIE_ContainerE2_1407P0 { + A_SEQUENCE_OF(struct RICsubscriptionRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P0_t; +typedef struct ProtocolIE_ContainerE2_1407P1 { + A_SEQUENCE_OF(struct RICsubscriptionResponse_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P1_t; +typedef struct ProtocolIE_ContainerE2_1407P2 { + A_SEQUENCE_OF(struct RICsubscriptionFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P2_t; +typedef struct ProtocolIE_ContainerE2_1407P3 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P3_t; +typedef struct ProtocolIE_ContainerE2_1407P4 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteResponse_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P4_t; +typedef struct ProtocolIE_ContainerE2_1407P5 { + A_SEQUENCE_OF(struct RICsubscriptionDeleteFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P5_t; +typedef struct ProtocolIE_ContainerE2_1407P6 { + A_SEQUENCE_OF(struct RICindication_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P6_t; +typedef struct ProtocolIE_ContainerE2_1407P7 { + A_SEQUENCE_OF(struct RICcontrolRequest_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P7_t; +typedef struct ProtocolIE_ContainerE2_1407P8 { + A_SEQUENCE_OF(struct RICcontrolAcknowledge_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P8_t; +typedef struct ProtocolIE_ContainerE2_1407P9 { + A_SEQUENCE_OF(struct RICcontrolFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P9_t; +typedef struct ProtocolIE_ContainerE2_1407P10 { + A_SEQUENCE_OF(struct ErrorIndicationE2_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P10_t; +typedef struct ProtocolIE_ContainerE2_1407P11 { + A_SEQUENCE_OF(struct E2setupRequestIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P11_t; +typedef struct ProtocolIE_ContainerE2_1407P12 { + A_SEQUENCE_OF(struct E2setupResponseIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P12_t; +typedef struct ProtocolIE_ContainerE2_1407P13 { + A_SEQUENCE_OF(struct E2setupFailureIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P13_t; +typedef struct ProtocolIE_ContainerE2_1407P14 { + A_SEQUENCE_OF(struct ResetRequestIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P14_t; +typedef struct ProtocolIE_ContainerE2_1407P15 { + A_SEQUENCE_OF(struct ResetResponseIEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P15_t; +typedef struct ProtocolIE_ContainerE2_1407P16 { + A_SEQUENCE_OF(struct RICserviceUpdate_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P16_t; +typedef struct ProtocolIE_ContainerE2_1407P17 { + A_SEQUENCE_OF(struct RICserviceUpdateAcknowledge_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P17_t; +typedef struct ProtocolIE_ContainerE2_1407P18 { + A_SEQUENCE_OF(struct RICserviceUpdateFailure_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P18_t; +typedef struct ProtocolIE_ContainerE2_1407P19 { + A_SEQUENCE_OF(struct RICserviceQuery_IEs) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ProtocolIE_ContainerE2_1407P19_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P0; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P0_specs_1; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P0_1[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P0_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P1; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P1_specs_3; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P1_3[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P1_constr_3; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P2; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P2_specs_5; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P2_5[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P2_constr_5; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P3; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P3_specs_7; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P3_7[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P3_constr_7; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P4; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P4_specs_9; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P4_9[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P4_constr_9; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P5; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P5_specs_11; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P5_11[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P5_constr_11; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P6; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P6_specs_13; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P6_13[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P6_constr_13; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P7; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P7_specs_15; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P7_15[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P7_constr_15; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P8; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P8_specs_17; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P8_17[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P8_constr_17; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P9; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P9_specs_19; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P9_19[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P9_constr_19; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P10; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P10_specs_21; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P10_21[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P10_constr_21; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P11; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P11_specs_23; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P11_23[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P11_constr_23; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P12; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P12_specs_25; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P12_25[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P12_constr_25; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P13; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P13_specs_27; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P13_27[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P13_constr_27; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P14; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P14_specs_29; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P14_29[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P14_constr_29; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P15; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P15_specs_31; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P15_31[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P15_constr_31; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P16; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P16_specs_33; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P16_33[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P16_constr_33; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P17; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P17_specs_35; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P17_35[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P17_constr_35; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P18; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P18_specs_37; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P18_37[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P18_constr_37; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_ContainerE2_1407P19; +extern asn_SET_OF_specifics_t asn_SPC_ProtocolIE_ContainerE2_1407P19_specs_39; +extern asn_TYPE_member_t asn_MBR_ProtocolIE_ContainerE2_1407P19_39[1]; +extern asn_per_constraints_t asn_PER_type_ProtocolIE_ContainerE2_1407P19_constr_39; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.c new file mode 100644 index 000000000..3b9b894d0 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerList.h" + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.h new file mode 100644 index 000000000..e3aca2bf6 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerList.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerList_H_ +#define _ProtocolIE_ContainerList_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerList_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.c new file mode 100644 index 000000000..ea31cdb45 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerPairE2.h" + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.h new file mode 100644 index 000000000..9157d114d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairE2.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerPairE2_H_ +#define _ProtocolIE_ContainerPairE2_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerPairE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.c new file mode 100644 index 000000000..e43c23120 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-ContainerPairList.h" + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.h new file mode 100644 index 000000000..e5aff3e05 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-ContainerPairList.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_ContainerPairList_H_ +#define _ProtocolIE_ContainerPairList_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_ContainerPairList_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.c new file mode 100644 index 000000000..d287458e1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.c @@ -0,0 +1,7424 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-FieldE2.h" + +static const long asn_VAL_4_id_RICaction_ToBeSetup_Item = 19; +static const long asn_VAL_4_ignore = 1; +static const long asn_VAL_4_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_4_id_RICaction_ToBeSetup_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_ToBeSetup_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_4_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_ToBeSetup_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_ToBeSetup_ItemIEs_1_rows } +}; +static const long asn_VAL_9_id_RICaction_Admitted_Item = 14; +static const long asn_VAL_9_ignore = 1; +static const long asn_VAL_9_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_Admitted_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_9_id_RICaction_Admitted_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_Admitted_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_9_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_Admitted_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_Admitted_ItemIEs_1_rows } +}; +static const long asn_VAL_10_id_RICaction_NotAdmitted_Item = 16; +static const long asn_VAL_10_ignore = 1; +static const long asn_VAL_10_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_10_id_RICaction_NotAdmitted_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_10_ignore }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_10_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICaction_NotAdmitted_ItemIEs_1[] = { + { 1, 4, asn_IOS_RICaction_NotAdmitted_ItemIEs_1_rows } +}; +static const long asn_VAL_64_id_RANfunction_Item = 8; +static const long asn_VAL_64_ignore = 1; +static const long asn_VAL_64_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunction_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_64_id_RANfunction_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_64_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunction_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_64_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunction_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunction_ItemIEs_1_rows } +}; +static const long asn_VAL_65_id_RANfunctionID_Item = 6; +static const long asn_VAL_65_ignore = 1; +static const long asn_VAL_65_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunctionID_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_65_id_RANfunctionID_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_65_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_65_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunctionID_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunctionID_ItemIEs_1_rows } +}; +static const long asn_VAL_68_id_RANfunctionIEcause_Item = 7; +static const long asn_VAL_68_ignore = 1; +static const long asn_VAL_68_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RANfunctionIDcause_ItemIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_68_id_RANfunctionIEcause_Item }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_68_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionIDcause_Item }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_68_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RANfunctionIDcause_ItemIEs_1[] = { + { 1, 4, asn_IOS_RANfunctionIDcause_ItemIEs_1_rows } +}; +static const long asn_VAL_1_id_RICrequestID = 29; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_1_mandatory = 2; +static const long asn_VAL_2_id_RANfunctionID = 5; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_2_mandatory = 2; +static const long asn_VAL_3_id_RICsubscriptionDetails = 30; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_3_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_1_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_1_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_2_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_2_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_3_id_RICsubscriptionDetails }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&Value", aioc__type, &asn_DEF_RICsubscriptionDetails }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_3_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionRequest_IEs_1[] = { + { 3, 4, asn_IOS_RICsubscriptionRequest_IEs_1_rows } +}; +static const long asn_VAL_5_id_RICrequestID = 29; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_5_mandatory = 2; +static const long asn_VAL_6_id_RANfunctionID = 5; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_6_mandatory = 2; +static const long asn_VAL_7_id_RICactions_Admitted = 17; +static const long asn_VAL_7_reject = 0; +static const long asn_VAL_7_mandatory = 2; +static const long asn_VAL_8_id_RICactions_NotAdmitted = 18; +static const long asn_VAL_8_reject = 0; +static const long asn_VAL_8_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionResponse_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_5_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_5_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_6_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_6_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_7_id_RICactions_Admitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_Admitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_7_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_8_id_RICactions_NotAdmitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_8_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionResponse_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionResponse_IEs_1_rows } +}; +static const long asn_VAL_11_id_RICrequestID = 29; +static const long asn_VAL_11_reject = 0; +static const long asn_VAL_11_mandatory = 2; +static const long asn_VAL_12_id_RANfunctionID = 5; +static const long asn_VAL_12_reject = 0; +static const long asn_VAL_12_mandatory = 2; +static const long asn_VAL_13_id_RICactions_NotAdmitted = 18; +static const long asn_VAL_13_reject = 0; +static const long asn_VAL_13_mandatory = 2; +static const long asn_VAL_14_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_14_ignore = 1; +static const long asn_VAL_14_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_11_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_11_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_11_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_12_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_12_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_12_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_13_id_RICactions_NotAdmitted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_13_reject }, + { "&Value", aioc__type, &asn_DEF_RICaction_NotAdmitted_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_13_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_14_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_14_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_14_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionFailure_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionFailure_IEs_1_rows } +}; +static const long asn_VAL_15_id_RICrequestID = 29; +static const long asn_VAL_15_reject = 0; +static const long asn_VAL_15_mandatory = 2; +static const long asn_VAL_16_id_RANfunctionID = 5; +static const long asn_VAL_16_reject = 0; +static const long asn_VAL_16_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_15_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_15_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_15_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_16_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_16_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_16_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteRequest_IEs_1[] = { + { 2, 4, asn_IOS_RICsubscriptionDeleteRequest_IEs_1_rows } +}; +static const long asn_VAL_17_id_RICrequestID = 29; +static const long asn_VAL_17_reject = 0; +static const long asn_VAL_17_mandatory = 2; +static const long asn_VAL_18_id_RANfunctionID = 5; +static const long asn_VAL_18_reject = 0; +static const long asn_VAL_18_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_17_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_17_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_17_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_18_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_18_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_18_mandatory } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteResponse_IEs_1[] = { + { 2, 4, asn_IOS_RICsubscriptionDeleteResponse_IEs_1_rows } +}; +static const long asn_VAL_19_id_RICrequestID = 29; +static const long asn_VAL_19_reject = 0; +static const long asn_VAL_19_mandatory = 2; +static const long asn_VAL_20_id_RANfunctionID = 5; +static const long asn_VAL_20_reject = 0; +static const long asn_VAL_20_mandatory = 2; +static const long asn_VAL_21_id_CauseE2 = 1; +static const long asn_VAL_21_ignore = 1; +static const long asn_VAL_21_mandatory = 2; +static const long asn_VAL_22_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_22_ignore = 1; +static const long asn_VAL_22_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_19_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_19_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_19_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_20_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_20_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_20_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_21_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_21_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_21_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_22_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_22_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_22_optional } +}; +static const asn_ioc_set_t asn_IOS_RICsubscriptionDeleteFailure_IEs_1[] = { + { 4, 4, asn_IOS_RICsubscriptionDeleteFailure_IEs_1_rows } +}; +static const long asn_VAL_23_id_RICrequestID = 29; +static const long asn_VAL_23_reject = 0; +static const long asn_VAL_23_mandatory = 2; +static const long asn_VAL_24_id_RANfunctionID = 5; +static const long asn_VAL_24_reject = 0; +static const long asn_VAL_24_mandatory = 2; +static const long asn_VAL_25_id_RICactionID = 15; +static const long asn_VAL_25_reject = 0; +static const long asn_VAL_25_mandatory = 2; +static const long asn_VAL_26_id_RICindicationSN = 27; +static const long asn_VAL_26_reject = 0; +static const long asn_VAL_26_optional = 0; +static const long asn_VAL_27_id_RICindicationType = 28; +static const long asn_VAL_27_reject = 0; +static const long asn_VAL_27_mandatory = 2; +static const long asn_VAL_28_id_RICindicationHeader = 25; +static const long asn_VAL_28_reject = 0; +static const long asn_VAL_28_mandatory = 2; +static const long asn_VAL_29_id_RICindicationMessage = 26; +static const long asn_VAL_29_reject = 0; +static const long asn_VAL_29_mandatory = 2; +static const long asn_VAL_30_id_RICcallProcessID = 20; +static const long asn_VAL_30_reject = 0; +static const long asn_VAL_30_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICindication_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_23_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_23_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_23_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_24_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_24_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_24_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_25_id_RICactionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_25_reject }, + { "&Value", aioc__type, &asn_DEF_RICactionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_25_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_26_id_RICindicationSN }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_26_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationSN }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_26_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_27_id_RICindicationType }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_27_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationType }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_27_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_28_id_RICindicationHeader }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_28_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationHeader }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_28_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_29_id_RICindicationMessage }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_29_reject }, + { "&Value", aioc__type, &asn_DEF_RICindicationMessage }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_29_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_30_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_30_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_30_optional } +}; +static const asn_ioc_set_t asn_IOS_RICindication_IEs_1[] = { + { 8, 4, asn_IOS_RICindication_IEs_1_rows } +}; +static const long asn_VAL_31_id_RICrequestID = 29; +static const long asn_VAL_31_reject = 0; +static const long asn_VAL_31_mandatory = 2; +static const long asn_VAL_32_id_RANfunctionID = 5; +static const long asn_VAL_32_reject = 0; +static const long asn_VAL_32_mandatory = 2; +static const long asn_VAL_33_id_RICcallProcessID = 20; +static const long asn_VAL_33_reject = 0; +static const long asn_VAL_33_optional = 0; +static const long asn_VAL_34_id_RICcontrolHeader = 22; +static const long asn_VAL_34_reject = 0; +static const long asn_VAL_34_mandatory = 2; +static const long asn_VAL_35_id_RICcontrolMessage = 23; +static const long asn_VAL_35_reject = 0; +static const long asn_VAL_35_mandatory = 2; +static const long asn_VAL_36_id_RICcontrolAckRequest = 21; +static const long asn_VAL_36_reject = 0; +static const long asn_VAL_36_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolRequest_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_31_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_31_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_31_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_32_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_32_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_32_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_33_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_33_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_33_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_34_id_RICcontrolHeader }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_34_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolHeader }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_34_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_35_id_RICcontrolMessage }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_35_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolMessage }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_35_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_36_id_RICcontrolAckRequest }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_36_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolAckRequest }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_36_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolRequest_IEs_1[] = { + { 6, 4, asn_IOS_RICcontrolRequest_IEs_1_rows } +}; +static const long asn_VAL_37_id_RICrequestID = 29; +static const long asn_VAL_37_reject = 0; +static const long asn_VAL_37_mandatory = 2; +static const long asn_VAL_38_id_RANfunctionID = 5; +static const long asn_VAL_38_reject = 0; +static const long asn_VAL_38_mandatory = 2; +static const long asn_VAL_39_id_RICcallProcessID = 20; +static const long asn_VAL_39_reject = 0; +static const long asn_VAL_39_optional = 0; +static const long asn_VAL_40_id_RICcontrolStatus = 24; +static const long asn_VAL_40_reject = 0; +static const long asn_VAL_40_mandatory = 2; +static const long asn_VAL_41_id_RICcontrolOutcome = 32; +static const long asn_VAL_41_reject = 0; +static const long asn_VAL_41_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolAcknowledge_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_37_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_37_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_37_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_38_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_38_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_38_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_39_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_39_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_39_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_40_id_RICcontrolStatus }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_40_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolStatus }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_40_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_41_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_41_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_41_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolAcknowledge_IEs_1[] = { + { 5, 4, asn_IOS_RICcontrolAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_42_id_RICrequestID = 29; +static const long asn_VAL_42_reject = 0; +static const long asn_VAL_42_mandatory = 2; +static const long asn_VAL_43_id_RANfunctionID = 5; +static const long asn_VAL_43_reject = 0; +static const long asn_VAL_43_mandatory = 2; +static const long asn_VAL_44_id_RICcallProcessID = 20; +static const long asn_VAL_44_reject = 0; +static const long asn_VAL_44_optional = 0; +static const long asn_VAL_45_id_CauseE2 = 1; +static const long asn_VAL_45_ignore = 1; +static const long asn_VAL_45_mandatory = 2; +static const long asn_VAL_46_id_RICcontrolOutcome = 32; +static const long asn_VAL_46_reject = 0; +static const long asn_VAL_46_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICcontrolFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_42_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_42_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_42_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_43_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_43_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_43_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_44_id_RICcallProcessID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_44_reject }, + { "&Value", aioc__type, &asn_DEF_RICcallProcessID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_44_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_45_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_45_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_45_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_46_id_RICcontrolOutcome }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_46_reject }, + { "&Value", aioc__type, &asn_DEF_RICcontrolOutcome }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_46_optional } +}; +static const asn_ioc_set_t asn_IOS_RICcontrolFailure_IEs_1[] = { + { 5, 4, asn_IOS_RICcontrolFailure_IEs_1_rows } +}; +static const long asn_VAL_47_id_RICrequestID = 29; +static const long asn_VAL_47_reject = 0; +static const long asn_VAL_47_optional = 0; +static const long asn_VAL_48_id_RANfunctionID = 5; +static const long asn_VAL_48_reject = 0; +static const long asn_VAL_48_optional = 0; +static const long asn_VAL_49_id_CauseE2 = 1; +static const long asn_VAL_49_ignore = 1; +static const long asn_VAL_49_optional = 0; +static const long asn_VAL_50_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_50_ignore = 1; +static const long asn_VAL_50_optional = 0; +static const asn_ioc_cell_t asn_IOS_ErrorIndicationE2_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_47_id_RICrequestID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_47_reject }, + { "&Value", aioc__type, &asn_DEF_RICrequestID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_47_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_48_id_RANfunctionID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_48_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_48_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_49_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_49_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_49_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_50_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_50_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_50_optional } +}; +static const asn_ioc_set_t asn_IOS_ErrorIndicationE2_IEs_1[] = { + { 4, 4, asn_IOS_ErrorIndicationE2_IEs_1_rows } +}; +static const long asn_VAL_51_id_GlobalE2node_ID = 3; +static const long asn_VAL_51_reject = 0; +static const long asn_VAL_51_mandatory = 2; +static const long asn_VAL_52_id_RANfunctionsAdded = 10; +static const long asn_VAL_52_reject = 0; +static const long asn_VAL_52_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupRequestIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_51_id_GlobalE2node_ID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_51_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalE2node_ID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_51_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_52_id_RANfunctionsAdded }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_52_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_52_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupRequestIEs_1[] = { + { 2, 4, asn_IOS_E2setupRequestIEs_1_rows } +}; +static const long asn_VAL_53_id_GlobalRIC_ID = 4; +static const long asn_VAL_53_reject = 0; +static const long asn_VAL_53_mandatory = 2; +static const long asn_VAL_54_id_RANfunctionsAccepted = 9; +static const long asn_VAL_54_reject = 0; +static const long asn_VAL_54_optional = 0; +static const long asn_VAL_55_id_RANfunctionsRejected = 13; +static const long asn_VAL_55_reject = 0; +static const long asn_VAL_55_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupResponseIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_53_id_GlobalRIC_ID }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_53_reject }, + { "&Value", aioc__type, &asn_DEF_GlobalRIC_ID }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_53_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_54_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_54_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_54_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_55_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_55_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_55_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupResponseIEs_1[] = { + { 3, 4, asn_IOS_E2setupResponseIEs_1_rows } +}; +static const long asn_VAL_56_id_CauseE2 = 1; +static const long asn_VAL_56_ignore = 1; +static const long asn_VAL_56_mandatory = 2; +static const long asn_VAL_57_id_TimeToWaitE2 = 31; +static const long asn_VAL_57_ignore = 1; +static const long asn_VAL_57_optional = 0; +static const long asn_VAL_58_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_58_ignore = 1; +static const long asn_VAL_58_optional = 0; +static const asn_ioc_cell_t asn_IOS_E2setupFailureIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_56_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_56_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_56_mandatory }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_57_id_TimeToWaitE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_57_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWaitE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_57_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_58_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_58_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_58_optional } +}; +static const asn_ioc_set_t asn_IOS_E2setupFailureIEs_1[] = { + { 3, 4, asn_IOS_E2setupFailureIEs_1_rows } +}; +static const long asn_VAL_59_id_CauseE2 = 1; +static const long asn_VAL_59_ignore = 1; +static const long asn_VAL_59_mandatory = 2; +static const asn_ioc_cell_t asn_IOS_ResetRequestIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_59_id_CauseE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_59_ignore }, + { "&Value", aioc__type, &asn_DEF_CauseE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_59_mandatory } +}; +static const asn_ioc_set_t asn_IOS_ResetRequestIEs_1[] = { + { 1, 4, asn_IOS_ResetRequestIEs_1_rows } +}; +static const long asn_VAL_60_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_60_ignore = 1; +static const long asn_VAL_60_optional = 0; +static const asn_ioc_cell_t asn_IOS_ResetResponseIEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_60_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_60_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_60_optional } +}; +static const asn_ioc_set_t asn_IOS_ResetResponseIEs_1[] = { + { 1, 4, asn_IOS_ResetResponseIEs_1_rows } +}; +static const long asn_VAL_61_id_RANfunctionsAdded = 10; +static const long asn_VAL_61_reject = 0; +static const long asn_VAL_61_optional = 0; +static const long asn_VAL_62_id_RANfunctionsModified = 12; +static const long asn_VAL_62_reject = 0; +static const long asn_VAL_62_optional = 0; +static const long asn_VAL_63_id_RANfunctionsDeleted = 11; +static const long asn_VAL_63_reject = 0; +static const long asn_VAL_63_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdate_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_61_id_RANfunctionsAdded }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_61_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_61_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_62_id_RANfunctionsModified }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_62_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctions_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_62_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_63_id_RANfunctionsDeleted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_63_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_63_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdate_IEs_1[] = { + { 3, 4, asn_IOS_RICserviceUpdate_IEs_1_rows } +}; +static const long asn_VAL_66_id_RANfunctionsAccepted = 9; +static const long asn_VAL_66_reject = 0; +static const long asn_VAL_66_optional = 0; +static const long asn_VAL_67_id_RANfunctionsRejected = 13; +static const long asn_VAL_67_reject = 0; +static const long asn_VAL_67_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_66_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_66_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_66_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_67_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_67_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_67_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdateAcknowledge_IEs_1[] = { + { 2, 4, asn_IOS_RICserviceUpdateAcknowledge_IEs_1_rows } +}; +static const long asn_VAL_69_id_RANfunctionsRejected = 13; +static const long asn_VAL_69_ignore = 1; +static const long asn_VAL_69_optional = 0; +static const long asn_VAL_70_id_TimeToWaitE2 = 31; +static const long asn_VAL_70_ignore = 1; +static const long asn_VAL_70_optional = 0; +static const long asn_VAL_71_id_CriticalityDiagnosticsE2 = 2; +static const long asn_VAL_71_ignore = 1; +static const long asn_VAL_71_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceUpdateFailure_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_69_id_RANfunctionsRejected }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_69_ignore }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsIDcause_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_69_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_70_id_TimeToWaitE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_70_ignore }, + { "&Value", aioc__type, &asn_DEF_TimeToWaitE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_70_optional }, + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_71_id_CriticalityDiagnosticsE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_71_ignore }, + { "&Value", aioc__type, &asn_DEF_CriticalityDiagnosticsE2 }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_71_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceUpdateFailure_IEs_1[] = { + { 3, 4, asn_IOS_RICserviceUpdateFailure_IEs_1_rows } +}; +static const long asn_VAL_72_id_RANfunctionsAccepted = 9; +static const long asn_VAL_72_reject = 0; +static const long asn_VAL_72_optional = 0; +static const asn_ioc_cell_t asn_IOS_RICserviceQuery_IEs_1_rows[] = { + { "&id", aioc__value, &asn_DEF_ProtocolIE_IDE2, &asn_VAL_72_id_RANfunctionsAccepted }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_72_reject }, + { "&Value", aioc__type, &asn_DEF_RANfunctionsID_List }, + { "&presence", aioc__value, &asn_DEF_PresenceE2, &asn_VAL_72_optional } +}; +static const asn_ioc_set_t asn_IOS_RICserviceQuery_IEs_1[] = { + { 1, 4, asn_IOS_RICserviceQuery_IEs_1_rows } +}; +static int +memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_ToBeSetup_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_ToBeSetup_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_ToBeSetup_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_ToBeSetup_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_Admitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_Admitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_Admitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_Admitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICaction_NotAdmitted_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICaction_NotAdmitted_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICaction_NotAdmitted_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICaction_NotAdmitted_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunction_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunction_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunction_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunction_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunctionID_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunctionID_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionID_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionID_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RANfunctionIDcause_ItemIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RANfunctionIDcause_ItemIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RANfunctionIDcause_ItemIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RANfunctionIDcause_ItemIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteResponse_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteResponse_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteResponse_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteResponse_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICsubscriptionDeleteFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICsubscriptionDeleteFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICsubscriptionDeleteFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICindication_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICindication_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICindication_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICindication_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolRequest_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolRequest_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolRequest_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolRequest_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICcontrolFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICcontrolFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICcontrolFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICcontrolFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ErrorIndicationE2_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ErrorIndicationE2_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndicationE2_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ErrorIndicationE2_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ErrorIndicationE2_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ErrorIndicationE2_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_E2setupFailureIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_E2setupFailureIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2setupFailureIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct E2setupFailureIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ResetRequestIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ResetRequestIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetRequestIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetRequestIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_ResetResponseIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_ResetResponseIEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_ResetResponseIEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ResetResponseIEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdate_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdate_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdate_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdate_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdateAcknowledge_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdateAcknowledge_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateAcknowledge_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateAcknowledge_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceUpdateFailure_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceUpdateFailure_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceUpdateFailure_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceUpdateFailure_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static int +memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_RICserviceQuery_IEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 1; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_RICserviceQuery_IEs_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_RICserviceQuery_IEs_1; + size_t constraining_column = 0; /* &id */ + size_t for_column = 2; /* &Value */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RICserviceQuery_IEs, id)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_id_constr_2 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_6 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_7 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_8 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_8 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_10 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_11 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_12 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_12 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_14 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_15 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_16 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_16 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_18 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_19 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_20 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_20 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_22 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_23 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_24 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_24 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_26 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_27 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_28 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_28 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_30 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_31 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_32 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_32 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_34 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_35 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_36 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_36 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_38 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_39 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_40 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_40 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_42 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_43 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_44 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_44 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_46 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_47 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_48 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_48 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_50 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_51 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_52 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_52 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_54 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_55 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_56 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_56 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_58 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_59 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_60 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_60 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_62 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_63 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_64 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_64 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_66 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_67 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_68 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_68 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_70 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_71 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_72 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_72 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_74 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_75 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_76 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_76 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_78 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_79 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_80 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_80 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_82 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_83 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_84 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_84 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_86 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_87 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_88 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_88 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_90 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_91 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_92 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_92 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_94 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_95 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_96 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_96 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_98 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_99 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_100 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_100 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_id_constr_102 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_103 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_104 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_104 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs__value, choice.RICaction_ToBeSetup_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_ToBeSetup_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-ToBeSetup-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-ToBeSetup-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct RICaction_ToBeSetup_ItemIEs__value), + offsetof(struct RICaction_ToBeSetup_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_ToBeSetup_ItemIEs__value, present), + sizeof(((struct RICaction_ToBeSetup_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_4, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 1, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_2, &asn_PER_memb_id_constr_2, memb_id_constraint_1 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_ToBeSetup_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_RICaction_ToBeSetup_ItemIEs_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 = { + sizeof(struct RICaction_ToBeSetup_ItemIEs), + offsetof(struct RICaction_ToBeSetup_ItemIEs, _asn_ctx), + asn_MAP_RICaction_ToBeSetup_ItemIEs_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs = { + "RICaction-ToBeSetup-ItemIEs", + "RICaction-ToBeSetup-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1, + sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */ + asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_ItemIEs_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_ItemIEs_1, + 3, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_8[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs__value, choice.RICaction_Admitted_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_Admitted_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-Admitted-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_8[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-Admitted-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_8 = { + sizeof(struct RICaction_Admitted_ItemIEs__value), + offsetof(struct RICaction_Admitted_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_Admitted_ItemIEs__value, present), + sizeof(((struct RICaction_Admitted_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_8, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_8 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_8, + 1, /* Elements count */ + &asn_SPC_value_specs_8 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_6, &asn_PER_memb_id_constr_6, memb_id_constraint_5 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_Admitted_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_7, &asn_PER_memb_criticality_constr_7, memb_criticality_constraint_5 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_8, + select_RICaction_Admitted_ItemIEs_value_type, + { &asn_OER_memb_value_constr_8, &asn_PER_memb_value_constr_8, memb_value_constraint_5 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_ItemIEs_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5 = { + sizeof(struct RICaction_Admitted_ItemIEs), + offsetof(struct RICaction_Admitted_ItemIEs, _asn_ctx), + asn_MAP_RICaction_Admitted_ItemIEs_tag2el_5, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs = { + "RICaction-Admitted-ItemIEs", + "RICaction-Admitted-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_Admitted_ItemIEs_tags_5, + sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5) + /sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */ + asn_DEF_RICaction_Admitted_ItemIEs_tags_5, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5) + /sizeof(asn_DEF_RICaction_Admitted_ItemIEs_tags_5[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_ItemIEs_5, + 3, /* Elements count */ + &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_12[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs__value, choice.RICaction_NotAdmitted_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_12[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICaction-NotAdmitted-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_12 = { + sizeof(struct RICaction_NotAdmitted_ItemIEs__value), + offsetof(struct RICaction_NotAdmitted_ItemIEs__value, _asn_ctx), + offsetof(struct RICaction_NotAdmitted_ItemIEs__value, present), + sizeof(((struct RICaction_NotAdmitted_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_12, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_12 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_12, + 1, /* Elements count */ + &asn_SPC_value_specs_12 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_10, &asn_PER_memb_id_constr_10, memb_id_constraint_9 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICaction_NotAdmitted_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_11, &asn_PER_memb_criticality_constr_11, memb_criticality_constraint_9 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_12, + select_RICaction_NotAdmitted_ItemIEs_value_type, + { &asn_OER_memb_value_constr_12, &asn_PER_memb_value_constr_12, memb_value_constraint_9 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 = { + sizeof(struct RICaction_NotAdmitted_ItemIEs), + offsetof(struct RICaction_NotAdmitted_ItemIEs, _asn_ctx), + asn_MAP_RICaction_NotAdmitted_ItemIEs_tag2el_9, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs = { + "RICaction-NotAdmitted-ItemIEs", + "RICaction-NotAdmitted-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9, + sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9) + /sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9) + /sizeof(asn_DEF_RICaction_NotAdmitted_ItemIEs_tags_9[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_ItemIEs_9, + 3, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_16[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs__value, choice.RANfunction_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunction_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunction-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_16[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunction-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_16 = { + sizeof(struct RANfunction_ItemIEs__value), + offsetof(struct RANfunction_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunction_ItemIEs__value, present), + sizeof(((struct RANfunction_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_16, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_16 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_16, + 1, /* Elements count */ + &asn_SPC_value_specs_16 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_14, &asn_PER_memb_id_constr_14, memb_id_constraint_13 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunction_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_15, &asn_PER_memb_criticality_constr_15, memb_criticality_constraint_13 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunction_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_16, + select_RANfunction_ItemIEs_value_type, + { &asn_OER_memb_value_constr_16, &asn_PER_memb_value_constr_16, memb_value_constraint_13 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunction_ItemIEs_tags_13[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunction_ItemIEs_tag2el_13[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13 = { + sizeof(struct RANfunction_ItemIEs), + offsetof(struct RANfunction_ItemIEs, _asn_ctx), + asn_MAP_RANfunction_ItemIEs_tag2el_13, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs = { + "RANfunction-ItemIEs", + "RANfunction-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_ItemIEs_tags_13, + sizeof(asn_DEF_RANfunction_ItemIEs_tags_13) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */ + asn_DEF_RANfunction_ItemIEs_tags_13, /* Same as above */ + sizeof(asn_DEF_RANfunction_ItemIEs_tags_13) + /sizeof(asn_DEF_RANfunction_ItemIEs_tags_13[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_20[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs__value, choice.RANfunctionID_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionID_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_20[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionID-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_20 = { + sizeof(struct RANfunctionID_ItemIEs__value), + offsetof(struct RANfunctionID_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunctionID_ItemIEs__value, present), + sizeof(((struct RANfunctionID_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_20, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_20 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_20, + 1, /* Elements count */ + &asn_SPC_value_specs_20 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_18, &asn_PER_memb_id_constr_18, memb_id_constraint_17 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunctionID_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_19, &asn_PER_memb_criticality_constr_19, memb_criticality_constraint_17 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_20, + select_RANfunctionID_ItemIEs_value_type, + { &asn_OER_memb_value_constr_20, &asn_PER_memb_value_constr_20, memb_value_constraint_17 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_ItemIEs_tags_17[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_ItemIEs_tag2el_17[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17 = { + sizeof(struct RANfunctionID_ItemIEs), + offsetof(struct RANfunctionID_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionID_ItemIEs_tag2el_17, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs = { + "RANfunctionID-ItemIEs", + "RANfunctionID-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionID_ItemIEs_tags_17, + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */ + asn_DEF_RANfunctionID_ItemIEs_tags_17, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17) + /sizeof(asn_DEF_RANfunctionID_ItemIEs_tags_17[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_24[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs__value, choice.RANfunctionIDcause_Item), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionIDcause_Item, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionIDcause-Item" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_24[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionIDcause-Item */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_24 = { + sizeof(struct RANfunctionIDcause_ItemIEs__value), + offsetof(struct RANfunctionIDcause_ItemIEs__value, _asn_ctx), + offsetof(struct RANfunctionIDcause_ItemIEs__value, present), + sizeof(((struct RANfunctionIDcause_ItemIEs__value *)0)->present), + asn_MAP_value_tag2el_24, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_24 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_24, + 1, /* Elements count */ + &asn_SPC_value_specs_24 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_22, &asn_PER_memb_id_constr_22, memb_id_constraint_21 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RANfunctionIDcause_ItemIEs_criticality_type, + { &asn_OER_memb_criticality_constr_23, &asn_PER_memb_criticality_constr_23, memb_criticality_constraint_21 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_ItemIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_24, + select_RANfunctionIDcause_ItemIEs_value_type, + { &asn_OER_memb_value_constr_24, &asn_PER_memb_value_constr_24, memb_value_constraint_21 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 = { + sizeof(struct RANfunctionIDcause_ItemIEs), + offsetof(struct RANfunctionIDcause_ItemIEs, _asn_ctx), + asn_MAP_RANfunctionIDcause_ItemIEs_tag2el_21, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs = { + "RANfunctionIDcause-ItemIEs", + "RANfunctionIDcause-ItemIEs", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionIDcause_ItemIEs_tags_21, + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */ + asn_DEF_RANfunctionIDcause_ItemIEs_tags_21, /* Same as above */ + sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21) + /sizeof(asn_DEF_RANfunctionIDcause_ItemIEs_tags_21[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_28[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs__value, choice.RICsubscriptionDetails), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDetails, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDetails" + }, +}; +static const unsigned asn_MAP_value_to_canonical_28[] = { 1, 0, 2 }; +static const unsigned asn_MAP_value_from_canonical_28[] = { 1, 0, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_28[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* RICsubscriptionDetails */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_28 = { + sizeof(struct RICsubscriptionRequest_IEs__value), + offsetof(struct RICsubscriptionRequest_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionRequest_IEs__value, present), + sizeof(((struct RICsubscriptionRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_28, + 3, /* Count of tags in the map */ + asn_MAP_value_to_canonical_28, + asn_MAP_value_from_canonical_28, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_28 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_28, + 3, /* Elements count */ + &asn_SPC_value_specs_28 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_26, &asn_PER_memb_id_constr_26, memb_id_constraint_25 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_27, &asn_PER_memb_criticality_constr_27, memb_criticality_constraint_25 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_28, + select_RICsubscriptionRequest_IEs_value_type, + { &asn_OER_memb_value_constr_28, &asn_PER_memb_value_constr_28, memb_value_constraint_25 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_IEs_tags_25[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_IEs_tag2el_25[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25 = { + sizeof(struct RICsubscriptionRequest_IEs), + offsetof(struct RICsubscriptionRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionRequest_IEs_tag2el_25, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs = { + "RICsubscriptionRequest-IEs", + "RICsubscriptionRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionRequest_IEs_tags_25, + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */ + asn_DEF_RICsubscriptionRequest_IEs_tags_25, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25) + /sizeof(asn_DEF_RICsubscriptionRequest_IEs_tags_25[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionRequest_IEs_25, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionRequest_IEs_specs_25 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_32[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_Admitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_Admitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-Admitted-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs__value, choice.RICaction_NotAdmitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-List" + }, +}; +static const unsigned asn_MAP_value_to_canonical_32[] = { 1, 0, 2, 3 }; +static const unsigned asn_MAP_value_from_canonical_32[] = { 1, 0, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_32[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-Admitted-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* RICaction-NotAdmitted-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_32 = { + sizeof(struct RICsubscriptionResponse_IEs__value), + offsetof(struct RICsubscriptionResponse_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionResponse_IEs__value, present), + sizeof(((struct RICsubscriptionResponse_IEs__value *)0)->present), + asn_MAP_value_tag2el_32, + 4, /* Count of tags in the map */ + asn_MAP_value_to_canonical_32, + asn_MAP_value_from_canonical_32, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_32 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_32, + 4, /* Elements count */ + &asn_SPC_value_specs_32 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_30, &asn_PER_memb_id_constr_30, memb_id_constraint_29 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionResponse_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_31, &asn_PER_memb_criticality_constr_31, memb_criticality_constraint_29 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_32, + select_RICsubscriptionResponse_IEs_value_type, + { &asn_OER_memb_value_constr_32, &asn_PER_memb_value_constr_32, memb_value_constraint_29 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_IEs_tags_29[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_IEs_tag2el_29[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29 = { + sizeof(struct RICsubscriptionResponse_IEs), + offsetof(struct RICsubscriptionResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionResponse_IEs_tag2el_29, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs = { + "RICsubscriptionResponse-IEs", + "RICsubscriptionResponse-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionResponse_IEs_tags_29, + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */ + asn_DEF_RICsubscriptionResponse_IEs_tags_29, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29) + /sizeof(asn_DEF_RICsubscriptionResponse_IEs_tags_29[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionResponse_IEs_29, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionResponse_IEs_specs_29 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_36[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.RICaction_NotAdmitted_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICaction_NotAdmitted_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICaction-NotAdmitted-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_36[] = { 1, 0, 2, 3 }; +static const unsigned asn_MAP_value_from_canonical_36[] = { 1, 0, 2, 3 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_36[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 1 }, /* RICaction-NotAdmitted-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -2, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_36 = { + sizeof(struct RICsubscriptionFailure_IEs__value), + offsetof(struct RICsubscriptionFailure_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionFailure_IEs__value, present), + sizeof(((struct RICsubscriptionFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_36, + 4, /* Count of tags in the map */ + asn_MAP_value_to_canonical_36, + asn_MAP_value_from_canonical_36, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_36 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_36, + 4, /* Elements count */ + &asn_SPC_value_specs_36 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_34, &asn_PER_memb_id_constr_34, memb_id_constraint_33 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_35, &asn_PER_memb_criticality_constr_35, memb_criticality_constraint_33 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_36, + select_RICsubscriptionFailure_IEs_value_type, + { &asn_OER_memb_value_constr_36, &asn_PER_memb_value_constr_36, memb_value_constraint_33 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_IEs_tags_33[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_IEs_tag2el_33[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33 = { + sizeof(struct RICsubscriptionFailure_IEs), + offsetof(struct RICsubscriptionFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionFailure_IEs_tag2el_33, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs = { + "RICsubscriptionFailure-IEs", + "RICsubscriptionFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionFailure_IEs_tags_33, + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */ + asn_DEF_RICsubscriptionFailure_IEs_tags_33, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33) + /sizeof(asn_DEF_RICsubscriptionFailure_IEs_tags_33[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionFailure_IEs_33, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionFailure_IEs_specs_33 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_40[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_40[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_40[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_40[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_40 = { + sizeof(struct RICsubscriptionDeleteRequest_IEs__value), + offsetof(struct RICsubscriptionDeleteRequest_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteRequest_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_40, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_40, + asn_MAP_value_from_canonical_40, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_40 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_40, + 2, /* Elements count */ + &asn_SPC_value_specs_40 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_38, &asn_PER_memb_id_constr_38, memb_id_constraint_37 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_39, &asn_PER_memb_criticality_constr_39, memb_criticality_constraint_37 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_40, + select_RICsubscriptionDeleteRequest_IEs_value_type, + { &asn_OER_memb_value_constr_40, &asn_PER_memb_value_constr_40, memb_value_constraint_37 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 = { + sizeof(struct RICsubscriptionDeleteRequest_IEs), + offsetof(struct RICsubscriptionDeleteRequest_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequest_IEs_tag2el_37, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs = { + "RICsubscriptionDeleteRequest-IEs", + "RICsubscriptionDeleteRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37, + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_IEs_tags_37[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteRequest_IEs_37, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_44[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_44[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_44[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_44[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_44 = { + sizeof(struct RICsubscriptionDeleteResponse_IEs__value), + offsetof(struct RICsubscriptionDeleteResponse_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteResponse_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteResponse_IEs__value *)0)->present), + asn_MAP_value_tag2el_44, + 2, /* Count of tags in the map */ + asn_MAP_value_to_canonical_44, + asn_MAP_value_from_canonical_44, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_44 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_44, + 2, /* Elements count */ + &asn_SPC_value_specs_44 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_42, &asn_PER_memb_id_constr_42, memb_id_constraint_41 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteResponse_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_43, &asn_PER_memb_criticality_constr_43, memb_criticality_constraint_41 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_44, + select_RICsubscriptionDeleteResponse_IEs_value_type, + { &asn_OER_memb_value_constr_44, &asn_PER_memb_value_constr_44, memb_value_constraint_41 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 = { + sizeof(struct RICsubscriptionDeleteResponse_IEs), + offsetof(struct RICsubscriptionDeleteResponse_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteResponse_IEs_tag2el_41, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs = { + "RICsubscriptionDeleteResponse-IEs", + "RICsubscriptionDeleteResponse-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41, + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_IEs_tags_41[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteResponse_IEs_41, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_48[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_48[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_48[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_48[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_48 = { + sizeof(struct RICsubscriptionDeleteFailure_IEs__value), + offsetof(struct RICsubscriptionDeleteFailure_IEs__value, _asn_ctx), + offsetof(struct RICsubscriptionDeleteFailure_IEs__value, present), + sizeof(((struct RICsubscriptionDeleteFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_48, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_48, + asn_MAP_value_from_canonical_48, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_48 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_48, + 4, /* Elements count */ + &asn_SPC_value_specs_48 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_46, &asn_PER_memb_id_constr_46, memb_id_constraint_45 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICsubscriptionDeleteFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_47, &asn_PER_memb_criticality_constr_47, memb_criticality_constraint_45 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_48, + select_RICsubscriptionDeleteFailure_IEs_value_type, + { &asn_OER_memb_value_constr_48, &asn_PER_memb_value_constr_48, memb_value_constraint_45 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 = { + sizeof(struct RICsubscriptionDeleteFailure_IEs), + offsetof(struct RICsubscriptionDeleteFailure_IEs, _asn_ctx), + asn_MAP_RICsubscriptionDeleteFailure_IEs_tag2el_45, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs = { + "RICsubscriptionDeleteFailure-IEs", + "RICsubscriptionDeleteFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45, + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_IEs_tags_45[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteFailure_IEs_45, + 3, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_52[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICactionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICactionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationSN), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RICindicationSN, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationSN" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationType), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICindicationType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationType" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationHeader), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICindicationHeader, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationHeader" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICindicationMessage), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICindicationMessage, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICindicationMessage" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, +}; +static const unsigned asn_MAP_value_to_canonical_52[] = { 1, 2, 3, 5, 6, 7, 4, 0 }; +static const unsigned asn_MAP_value_from_canonical_52[] = { 7, 0, 1, 2, 6, 3, 4, 5 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_52[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 2 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 2, -1, 1 }, /* RICactionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 3, -2, 0 }, /* RICindicationSN */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 5, 0, 2 }, /* RICindicationHeader */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 6, -1, 1 }, /* RICindicationMessage */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 7, -2, 0 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* RICindicationType */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_52 = { + sizeof(struct RICindication_IEs__value), + offsetof(struct RICindication_IEs__value, _asn_ctx), + offsetof(struct RICindication_IEs__value, present), + sizeof(((struct RICindication_IEs__value *)0)->present), + asn_MAP_value_tag2el_52, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_52, + asn_MAP_value_from_canonical_52, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_52 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_52, + 8, /* Elements count */ + &asn_SPC_value_specs_52 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICindication_IEs_49[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_50, &asn_PER_memb_id_constr_50, memb_id_constraint_49 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICindication_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_51, &asn_PER_memb_criticality_constr_51, memb_criticality_constraint_49 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICindication_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_52, + select_RICindication_IEs_value_type, + { &asn_OER_memb_value_constr_52, &asn_PER_memb_value_constr_52, memb_value_constraint_49 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICindication_IEs_tags_49[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICindication_IEs_tag2el_49[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49 = { + sizeof(struct RICindication_IEs), + offsetof(struct RICindication_IEs, _asn_ctx), + asn_MAP_RICindication_IEs_tag2el_49, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICindication_IEs = { + "RICindication-IEs", + "RICindication-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICindication_IEs_tags_49, + sizeof(asn_DEF_RICindication_IEs_tags_49) + /sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */ + asn_DEF_RICindication_IEs_tags_49, /* Same as above */ + sizeof(asn_DEF_RICindication_IEs_tags_49) + /sizeof(asn_DEF_RICindication_IEs_tags_49[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICindication_IEs_49, + 3, /* Elements count */ + &asn_SPC_RICindication_IEs_specs_49 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_56[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolHeader), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolHeader, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolHeader" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolMessage), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolMessage, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolMessage" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs__value, choice.RICcontrolAckRequest), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICcontrolAckRequest, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolAckRequest" + }, +}; +static const unsigned asn_MAP_value_to_canonical_56[] = { 1, 2, 3, 4, 5, 0 }; +static const unsigned asn_MAP_value_from_canonical_56[] = { 5, 0, 1, 2, 3, 4 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_56[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 2 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 3, -1, 1 }, /* RICcontrolHeader */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -2, 0 }, /* RICcontrolMessage */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 5, 0, 0 }, /* RICcontrolAckRequest */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_56 = { + sizeof(struct RICcontrolRequest_IEs__value), + offsetof(struct RICcontrolRequest_IEs__value, _asn_ctx), + offsetof(struct RICcontrolRequest_IEs__value, present), + sizeof(((struct RICcontrolRequest_IEs__value *)0)->present), + asn_MAP_value_tag2el_56, + 6, /* Count of tags in the map */ + asn_MAP_value_to_canonical_56, + asn_MAP_value_from_canonical_56, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_56 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_56, + 6, /* Elements count */ + &asn_SPC_value_specs_56 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_54, &asn_PER_memb_id_constr_54, memb_id_constraint_53 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolRequest_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_55, &asn_PER_memb_criticality_constr_55, memb_criticality_constraint_53 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_56, + select_RICcontrolRequest_IEs_value_type, + { &asn_OER_memb_value_constr_56, &asn_PER_memb_value_constr_56, memb_value_constraint_53 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_IEs_tags_53[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_IEs_tag2el_53[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53 = { + sizeof(struct RICcontrolRequest_IEs), + offsetof(struct RICcontrolRequest_IEs, _asn_ctx), + asn_MAP_RICcontrolRequest_IEs_tag2el_53, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs = { + "RICcontrolRequest-IEs", + "RICcontrolRequest-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolRequest_IEs_tags_53, + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */ + asn_DEF_RICcontrolRequest_IEs_tags_53, /* Same as above */ + sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53) + /sizeof(asn_DEF_RICcontrolRequest_IEs_tags_53[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolRequest_IEs_53, + 3, /* Elements count */ + &asn_SPC_RICcontrolRequest_IEs_specs_53 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_60[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolStatus), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_RICcontrolStatus, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolStatus" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolOutcome, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolOutcome" + }, +}; +static const unsigned asn_MAP_value_to_canonical_60[] = { 1, 2, 4, 3, 0 }; +static const unsigned asn_MAP_value_from_canonical_60[] = { 4, 0, 1, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_60[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */ + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, 0, 0 }, /* RICcontrolStatus */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RICrequestID */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_60 = { + sizeof(struct RICcontrolAcknowledge_IEs__value), + offsetof(struct RICcontrolAcknowledge_IEs__value, _asn_ctx), + offsetof(struct RICcontrolAcknowledge_IEs__value, present), + sizeof(((struct RICcontrolAcknowledge_IEs__value *)0)->present), + asn_MAP_value_tag2el_60, + 5, /* Count of tags in the map */ + asn_MAP_value_to_canonical_60, + asn_MAP_value_from_canonical_60, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_60 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_60, + 5, /* Elements count */ + &asn_SPC_value_specs_60 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_58, &asn_PER_memb_id_constr_58, memb_id_constraint_57 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolAcknowledge_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_59, &asn_PER_memb_criticality_constr_59, memb_criticality_constraint_57 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_60, + select_RICcontrolAcknowledge_IEs_value_type, + { &asn_OER_memb_value_constr_60, &asn_PER_memb_value_constr_60, memb_value_constraint_57 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_IEs_tags_57[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57 = { + sizeof(struct RICcontrolAcknowledge_IEs), + offsetof(struct RICcontrolAcknowledge_IEs, _asn_ctx), + asn_MAP_RICcontrolAcknowledge_IEs_tag2el_57, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs = { + "RICcontrolAcknowledge-IEs", + "RICcontrolAcknowledge-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolAcknowledge_IEs_tags_57, + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */ + asn_DEF_RICcontrolAcknowledge_IEs_tags_57, /* Same as above */ + sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57) + /sizeof(asn_DEF_RICcontrolAcknowledge_IEs_tags_57[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolAcknowledge_IEs_57, + 3, /* Elements count */ + &asn_SPC_RICcontrolAcknowledge_IEs_specs_57 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_64[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcallProcessID), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcallProcessID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcallProcessID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs__value, choice.RICcontrolOutcome), + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), + 0, + &asn_DEF_RICcontrolOutcome, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolOutcome" + }, +}; +static const unsigned asn_MAP_value_to_canonical_64[] = { 1, 2, 4, 0, 3 }; +static const unsigned asn_MAP_value_from_canonical_64[] = { 3, 0, 1, 4, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_64[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 2, 0, 1 }, /* RICcallProcessID */ + { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 4, -1, 0 }, /* RICcontrolOutcome */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 }, /* RICrequestID */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 3, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 3, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_64 = { + sizeof(struct RICcontrolFailure_IEs__value), + offsetof(struct RICcontrolFailure_IEs__value, _asn_ctx), + offsetof(struct RICcontrolFailure_IEs__value, present), + sizeof(((struct RICcontrolFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_64, + 9, /* Count of tags in the map */ + asn_MAP_value_to_canonical_64, + asn_MAP_value_from_canonical_64, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_64 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_64, + 5, /* Elements count */ + &asn_SPC_value_specs_64 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_62, &asn_PER_memb_id_constr_62, memb_id_constraint_61 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICcontrolFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_63, &asn_PER_memb_criticality_constr_63, memb_criticality_constraint_61 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_64, + select_RICcontrolFailure_IEs_value_type, + { &asn_OER_memb_value_constr_64, &asn_PER_memb_value_constr_64, memb_value_constraint_61 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_IEs_tags_61[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_IEs_tag2el_61[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61 = { + sizeof(struct RICcontrolFailure_IEs), + offsetof(struct RICcontrolFailure_IEs, _asn_ctx), + asn_MAP_RICcontrolFailure_IEs_tag2el_61, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs = { + "RICcontrolFailure-IEs", + "RICcontrolFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolFailure_IEs_tags_61, + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */ + asn_DEF_RICcontrolFailure_IEs_tags_61, /* Same as above */ + sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61) + /sizeof(asn_DEF_RICcontrolFailure_IEs_tags_61[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolFailure_IEs_61, + 3, /* Elements count */ + &asn_SPC_RICcontrolFailure_IEs_specs_61 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_68[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.RICrequestID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICrequestID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICrequestID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.RANfunctionID), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), + 0, + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_68[] = { 1, 0, 3, 2 }; +static const unsigned asn_MAP_value_from_canonical_68[] = { 1, 0, 3, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_68[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* RANfunctionID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RICrequestID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -1, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 2, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_68 = { + sizeof(struct ErrorIndicationE2_IEs__value), + offsetof(struct ErrorIndicationE2_IEs__value, _asn_ctx), + offsetof(struct ErrorIndicationE2_IEs__value, present), + sizeof(((struct ErrorIndicationE2_IEs__value *)0)->present), + asn_MAP_value_tag2el_68, + 8, /* Count of tags in the map */ + asn_MAP_value_to_canonical_68, + asn_MAP_value_from_canonical_68, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_68 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_68, + 4, /* Elements count */ + &asn_SPC_value_specs_68 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ErrorIndicationE2_IEs_65[] = { + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_66, &asn_PER_memb_id_constr_66, memb_id_constraint_65 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ErrorIndicationE2_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_67, &asn_PER_memb_criticality_constr_67, memb_criticality_constraint_65 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ErrorIndicationE2_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_68, + select_ErrorIndicationE2_IEs_value_type, + { &asn_OER_memb_value_constr_68, &asn_PER_memb_value_constr_68, memb_value_constraint_65 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ErrorIndicationE2_IEs_tags_65[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ErrorIndicationE2_IEs_tag2el_65[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_IEs_specs_65 = { + sizeof(struct ErrorIndicationE2_IEs), + offsetof(struct ErrorIndicationE2_IEs, _asn_ctx), + asn_MAP_ErrorIndicationE2_IEs_tag2el_65, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2_IEs = { + "ErrorIndicationE2-IEs", + "ErrorIndicationE2-IEs", + &asn_OP_SEQUENCE, + asn_DEF_ErrorIndicationE2_IEs_tags_65, + sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65) + /sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65[0]), /* 1 */ + asn_DEF_ErrorIndicationE2_IEs_tags_65, /* Same as above */ + sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65) + /sizeof(asn_DEF_ErrorIndicationE2_IEs_tags_65[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ErrorIndicationE2_IEs_65, + 3, /* Elements count */ + &asn_SPC_ErrorIndicationE2_IEs_specs_65 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_72[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.GlobalE2node_ID), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_GlobalE2node_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "GlobalE2node-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs__value, choice.RANfunctions_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctions_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctions-List" + }, +}; +static const unsigned asn_MAP_value_to_canonical_72[] = { 1, 0 }; +static const unsigned asn_MAP_value_from_canonical_72[] = { 1, 0 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_72[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gNB */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* en-gNB */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* ng-eNB */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 } /* eNB */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_72 = { + sizeof(struct E2setupRequestIEs__value), + offsetof(struct E2setupRequestIEs__value, _asn_ctx), + offsetof(struct E2setupRequestIEs__value, present), + sizeof(((struct E2setupRequestIEs__value *)0)->present), + asn_MAP_value_tag2el_72, + 5, /* Count of tags in the map */ + asn_MAP_value_to_canonical_72, + asn_MAP_value_from_canonical_72, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_72 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_72, + 2, /* Elements count */ + &asn_SPC_value_specs_72 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_70, &asn_PER_memb_id_constr_70, memb_id_constraint_69 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupRequestIEs_criticality_type, + { &asn_OER_memb_criticality_constr_71, &asn_PER_memb_criticality_constr_71, memb_criticality_constraint_69 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupRequestIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_72, + select_E2setupRequestIEs_value_type, + { &asn_OER_memb_value_constr_72, &asn_PER_memb_value_constr_72, memb_value_constraint_69 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupRequestIEs_tags_69[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupRequestIEs_tag2el_69[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69 = { + sizeof(struct E2setupRequestIEs), + offsetof(struct E2setupRequestIEs, _asn_ctx), + asn_MAP_E2setupRequestIEs_tag2el_69, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs = { + "E2setupRequestIEs", + "E2setupRequestIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupRequestIEs_tags_69, + sizeof(asn_DEF_E2setupRequestIEs_tags_69) + /sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */ + asn_DEF_E2setupRequestIEs_tags_69, /* Same as above */ + sizeof(asn_DEF_E2setupRequestIEs_tags_69) + /sizeof(asn_DEF_E2setupRequestIEs_tags_69[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupRequestIEs_69, + 3, /* Elements count */ + &asn_SPC_E2setupRequestIEs_specs_69 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_76[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.GlobalRIC_ID), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_GlobalRIC_ID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "GlobalRIC-ID" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_76[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 2 }, /* GlobalRIC-ID */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 1 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 0 } /* RANfunctionsIDcause-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_76 = { + sizeof(struct E2setupResponseIEs__value), + offsetof(struct E2setupResponseIEs__value, _asn_ctx), + offsetof(struct E2setupResponseIEs__value, present), + sizeof(((struct E2setupResponseIEs__value *)0)->present), + asn_MAP_value_tag2el_76, + 3, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_76 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_76, + 3, /* Elements count */ + &asn_SPC_value_specs_76 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_74, &asn_PER_memb_id_constr_74, memb_id_constraint_73 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupResponseIEs_criticality_type, + { &asn_OER_memb_criticality_constr_75, &asn_PER_memb_criticality_constr_75, memb_criticality_constraint_73 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupResponseIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_76, + select_E2setupResponseIEs_value_type, + { &asn_OER_memb_value_constr_76, &asn_PER_memb_value_constr_76, memb_value_constraint_73 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupResponseIEs_tags_73[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupResponseIEs_tag2el_73[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73 = { + sizeof(struct E2setupResponseIEs), + offsetof(struct E2setupResponseIEs, _asn_ctx), + asn_MAP_E2setupResponseIEs_tag2el_73, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs = { + "E2setupResponseIEs", + "E2setupResponseIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupResponseIEs_tags_73, + sizeof(asn_DEF_E2setupResponseIEs_tags_73) + /sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */ + asn_DEF_E2setupResponseIEs_tags_73, /* Same as above */ + sizeof(asn_DEF_E2setupResponseIEs_tags_73) + /sizeof(asn_DEF_E2setupResponseIEs_tags_73[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupResponseIEs_73, + 3, /* Elements count */ + &asn_SPC_E2setupResponseIEs_specs_73 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_80[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.TimeToWaitE2), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_TimeToWaitE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "TimeToWaitE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_80[] = { 1, 2, 0 }; +static const unsigned asn_MAP_value_from_canonical_80[] = { 2, 0, 1 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_80[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWaitE2 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, 0, 0 }, /* CriticalityDiagnosticsE2 */ + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_80 = { + sizeof(struct E2setupFailureIEs__value), + offsetof(struct E2setupFailureIEs__value, _asn_ctx), + offsetof(struct E2setupFailureIEs__value, present), + sizeof(((struct E2setupFailureIEs__value *)0)->present), + asn_MAP_value_tag2el_80, + 7, /* Count of tags in the map */ + asn_MAP_value_to_canonical_80, + asn_MAP_value_from_canonical_80, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_80 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_80, + 3, /* Elements count */ + &asn_SPC_value_specs_80 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[] = { + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_78, &asn_PER_memb_id_constr_78, memb_id_constraint_77 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_E2setupFailureIEs_criticality_type, + { &asn_OER_memb_criticality_constr_79, &asn_PER_memb_criticality_constr_79, memb_criticality_constraint_77 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct E2setupFailureIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_80, + select_E2setupFailureIEs_value_type, + { &asn_OER_memb_value_constr_80, &asn_PER_memb_value_constr_80, memb_value_constraint_77 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_E2setupFailureIEs_tags_77[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_E2setupFailureIEs_tag2el_77[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77 = { + sizeof(struct E2setupFailureIEs), + offsetof(struct E2setupFailureIEs, _asn_ctx), + asn_MAP_E2setupFailureIEs_tag2el_77, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs = { + "E2setupFailureIEs", + "E2setupFailureIEs", + &asn_OP_SEQUENCE, + asn_DEF_E2setupFailureIEs_tags_77, + sizeof(asn_DEF_E2setupFailureIEs_tags_77) + /sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */ + asn_DEF_E2setupFailureIEs_tags_77, /* Same as above */ + sizeof(asn_DEF_E2setupFailureIEs_tags_77) + /sizeof(asn_DEF_E2setupFailureIEs_tags_77[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_E2setupFailureIEs_77, + 3, /* Elements count */ + &asn_SPC_E2setupFailureIEs_specs_77 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_84[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs__value, choice.CauseE2), + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CauseE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_84[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequest */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* ricService */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 }, /* transport */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 0, 0, 0 }, /* protocol */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 0, 0, 0 } /* misc */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_84 = { + sizeof(struct ResetRequestIEs__value), + offsetof(struct ResetRequestIEs__value, _asn_ctx), + offsetof(struct ResetRequestIEs__value, present), + sizeof(((struct ResetRequestIEs__value *)0)->present), + asn_MAP_value_tag2el_84, + 5, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_84 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_84, + 1, /* Elements count */ + &asn_SPC_value_specs_84 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_82, &asn_PER_memb_id_constr_82, memb_id_constraint_81 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ResetRequestIEs_criticality_type, + { &asn_OER_memb_criticality_constr_83, &asn_PER_memb_criticality_constr_83, memb_criticality_constraint_81 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetRequestIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_84, + select_ResetRequestIEs_value_type, + { &asn_OER_memb_value_constr_84, &asn_PER_memb_value_constr_84, memb_value_constraint_81 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetRequestIEs_tags_81[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetRequestIEs_tag2el_81[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81 = { + sizeof(struct ResetRequestIEs), + offsetof(struct ResetRequestIEs, _asn_ctx), + asn_MAP_ResetRequestIEs_tag2el_81, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs = { + "ResetRequestIEs", + "ResetRequestIEs", + &asn_OP_SEQUENCE, + asn_DEF_ResetRequestIEs_tags_81, + sizeof(asn_DEF_ResetRequestIEs_tags_81) + /sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */ + asn_DEF_ResetRequestIEs_tags_81, /* Same as above */ + sizeof(asn_DEF_ResetRequestIEs_tags_81) + /sizeof(asn_DEF_ResetRequestIEs_tags_81[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetRequestIEs_81, + 3, /* Elements count */ + &asn_SPC_ResetRequestIEs_specs_81 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_88[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_88[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_88 = { + sizeof(struct ResetResponseIEs__value), + offsetof(struct ResetResponseIEs__value, _asn_ctx), + offsetof(struct ResetResponseIEs__value, present), + sizeof(((struct ResetResponseIEs__value *)0)->present), + asn_MAP_value_tag2el_88, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_88 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_88, + 1, /* Elements count */ + &asn_SPC_value_specs_88 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_86, &asn_PER_memb_id_constr_86, memb_id_constraint_85 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_ResetResponseIEs_criticality_type, + { &asn_OER_memb_criticality_constr_87, &asn_PER_memb_criticality_constr_87, memb_criticality_constraint_85 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResetResponseIEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_88, + select_ResetResponseIEs_value_type, + { &asn_OER_memb_value_constr_88, &asn_PER_memb_value_constr_88, memb_value_constraint_85 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetResponseIEs_tags_85[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetResponseIEs_tag2el_85[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85 = { + sizeof(struct ResetResponseIEs), + offsetof(struct ResetResponseIEs, _asn_ctx), + asn_MAP_ResetResponseIEs_tag2el_85, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs = { + "ResetResponseIEs", + "ResetResponseIEs", + &asn_OP_SEQUENCE, + asn_DEF_ResetResponseIEs_tags_85, + sizeof(asn_DEF_ResetResponseIEs_tags_85) + /sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */ + asn_DEF_ResetResponseIEs_tags_85, /* Same as above */ + sizeof(asn_DEF_ResetResponseIEs_tags_85) + /sizeof(asn_DEF_ResetResponseIEs_tags_85[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetResponseIEs_85, + 3, /* Elements count */ + &asn_SPC_ResetResponseIEs_specs_85 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_92[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctions_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctions_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctions-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_92[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctions-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsID-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_92 = { + sizeof(struct RICserviceUpdate_IEs__value), + offsetof(struct RICserviceUpdate_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdate_IEs__value, present), + sizeof(((struct RICserviceUpdate_IEs__value *)0)->present), + asn_MAP_value_tag2el_92, + 2, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_92 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_92, + 2, /* Elements count */ + &asn_SPC_value_specs_92 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_90, &asn_PER_memb_id_constr_90, memb_id_constraint_89 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdate_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_91, &asn_PER_memb_criticality_constr_91, memb_criticality_constraint_89 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_92, + select_RICserviceUpdate_IEs_value_type, + { &asn_OER_memb_value_constr_92, &asn_PER_memb_value_constr_92, memb_value_constraint_89 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_IEs_tags_89[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_IEs_tag2el_89[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89 = { + sizeof(struct RICserviceUpdate_IEs), + offsetof(struct RICserviceUpdate_IEs, _asn_ctx), + asn_MAP_RICserviceUpdate_IEs_tag2el_89, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs = { + "RICserviceUpdate-IEs", + "RICserviceUpdate-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdate_IEs_tags_89, + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */ + asn_DEF_RICserviceUpdate_IEs_tags_89, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89) + /sizeof(asn_DEF_RICserviceUpdate_IEs_tags_89[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdate_IEs_89, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdate_IEs_specs_89 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_96[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_96[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsID-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 0 } /* RANfunctionsIDcause-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_96 = { + sizeof(struct RICserviceUpdateAcknowledge_IEs__value), + offsetof(struct RICserviceUpdateAcknowledge_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdateAcknowledge_IEs__value, present), + sizeof(((struct RICserviceUpdateAcknowledge_IEs__value *)0)->present), + asn_MAP_value_tag2el_96, + 2, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_96 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_96, + 2, /* Elements count */ + &asn_SPC_value_specs_96 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_94, &asn_PER_memb_id_constr_94, memb_id_constraint_93 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdateAcknowledge_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_95, &asn_PER_memb_criticality_constr_95, memb_criticality_constraint_93 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_96, + select_RICserviceUpdateAcknowledge_IEs_value_type, + { &asn_OER_memb_value_constr_96, &asn_PER_memb_value_constr_96, memb_value_constraint_93 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 = { + sizeof(struct RICserviceUpdateAcknowledge_IEs), + offsetof(struct RICserviceUpdateAcknowledge_IEs, _asn_ctx), + asn_MAP_RICserviceUpdateAcknowledge_IEs_tag2el_93, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs = { + "RICserviceUpdateAcknowledge-IEs", + "RICserviceUpdateAcknowledge-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93, + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */ + asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_IEs_tags_93[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateAcknowledge_IEs_93, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_100[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.RANfunctionsIDcause_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsIDcause_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsIDcause-List" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.TimeToWaitE2), + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), + 0, + &asn_DEF_TimeToWaitE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "TimeToWaitE2" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs__value, choice.CriticalityDiagnosticsE2), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_CriticalityDiagnosticsE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "CriticalityDiagnosticsE2" + }, +}; +static const unsigned asn_MAP_value_to_canonical_100[] = { 1, 0, 2 }; +static const unsigned asn_MAP_value_from_canonical_100[] = { 1, 0, 2 }; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_100[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 0 }, /* TimeToWaitE2 */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* RANfunctionsIDcause-List */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* CriticalityDiagnosticsE2 */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_100 = { + sizeof(struct RICserviceUpdateFailure_IEs__value), + offsetof(struct RICserviceUpdateFailure_IEs__value, _asn_ctx), + offsetof(struct RICserviceUpdateFailure_IEs__value, present), + sizeof(((struct RICserviceUpdateFailure_IEs__value *)0)->present), + asn_MAP_value_tag2el_100, + 3, /* Count of tags in the map */ + asn_MAP_value_to_canonical_100, + asn_MAP_value_from_canonical_100, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_100 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_100, + 3, /* Elements count */ + &asn_SPC_value_specs_100 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_98, &asn_PER_memb_id_constr_98, memb_id_constraint_97 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceUpdateFailure_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_99, &asn_PER_memb_criticality_constr_99, memb_criticality_constraint_97 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_100, + select_RICserviceUpdateFailure_IEs_value_type, + { &asn_OER_memb_value_constr_100, &asn_PER_memb_value_constr_100, memb_value_constraint_97 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_IEs_tags_97[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97 = { + sizeof(struct RICserviceUpdateFailure_IEs), + offsetof(struct RICserviceUpdateFailure_IEs, _asn_ctx), + asn_MAP_RICserviceUpdateFailure_IEs_tag2el_97, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs = { + "RICserviceUpdateFailure-IEs", + "RICserviceUpdateFailure-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateFailure_IEs_tags_97, + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */ + asn_DEF_RICserviceUpdateFailure_IEs_tags_97, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97) + /sizeof(asn_DEF_RICserviceUpdateFailure_IEs_tags_97[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateFailure_IEs_97, + 3, /* Elements count */ + &asn_SPC_RICserviceUpdateFailure_IEs_specs_97 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_value_104[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs__value, choice.RANfunctionsID_List), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RANfunctionsID_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RANfunctionsID-List" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_104[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* RANfunctionsID-List */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_104 = { + sizeof(struct RICserviceQuery_IEs__value), + offsetof(struct RICserviceQuery_IEs__value, _asn_ctx), + offsetof(struct RICserviceQuery_IEs__value, present), + sizeof(((struct RICserviceQuery_IEs__value *)0)->present), + asn_MAP_value_tag2el_104, + 1, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_104 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_104, + 1, /* Elements count */ + &asn_SPC_value_specs_104 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, id), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_IDE2, + 0, + { &asn_OER_memb_id_constr_102, &asn_PER_memb_id_constr_102, memb_id_constraint_101 }, + 0, 0, /* No default value */ + "id" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_RICserviceQuery_IEs_criticality_type, + { &asn_OER_memb_criticality_constr_103, &asn_PER_memb_criticality_constr_103, memb_criticality_constraint_101 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery_IEs, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_104, + select_RICserviceQuery_IEs_value_type, + { &asn_OER_memb_value_constr_104, &asn_PER_memb_value_constr_104, memb_value_constraint_101 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceQuery_IEs_tags_101[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_IEs_tag2el_101[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101 = { + sizeof(struct RICserviceQuery_IEs), + offsetof(struct RICserviceQuery_IEs, _asn_ctx), + asn_MAP_RICserviceQuery_IEs_tag2el_101, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs = { + "RICserviceQuery-IEs", + "RICserviceQuery-IEs", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceQuery_IEs_tags_101, + sizeof(asn_DEF_RICserviceQuery_IEs_tags_101) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */ + asn_DEF_RICserviceQuery_IEs_tags_101, /* Same as above */ + sizeof(asn_DEF_RICserviceQuery_IEs_tags_101) + /sizeof(asn_DEF_RICserviceQuery_IEs_tags_101[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceQuery_IEs_101, + 3, /* Elements count */ + &asn_SPC_RICserviceQuery_IEs_specs_101 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.h new file mode 100644 index 000000000..dd6583ec3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldE2.h @@ -0,0 +1,757 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_FieldE2_H_ +#define _ProtocolIE_FieldE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-IDE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICaction-ToBeSetup-Item.h" +#include "PresenceE2.h" +#include +#include +#include +#include "RICaction-Admitted-Item.h" +#include "RICaction-NotAdmitted-Item.h" +#include "RANfunction-Item.h" +#include "RANfunctionID-Item.h" +#include "RANfunctionIDcause-Item.h" +#include "RICrequestID.h" +#include "RANfunctionID.h" +#include "RICsubscriptionDetails.h" +#include "RICaction-Admitted-List.h" +#include "RICaction-NotAdmitted-List.h" +#include "CriticalityDiagnosticsE2.h" +#include "CauseE2.h" +#include "RICactionID.h" +#include "RICindicationSN.h" +#include "RICindicationType.h" +#include "RICindicationHeader.h" +#include "RICindicationMessage.h" +#include "RICcallProcessID.h" +#include "RICcontrolHeader.h" +#include "RICcontrolMessage.h" +#include "RICcontrolAckRequest.h" +#include "RICcontrolStatus.h" +#include "RICcontrolOutcome.h" +#include "GlobalE2node-ID.h" +#include "RANfunctions-List.h" +#include "GlobalRIC-ID.h" +#include "RANfunctionsID-List.h" +#include "RANfunctionsIDcause-List.h" +#include "TimeToWaitE2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICaction_ToBeSetup_ItemIEs__value_PR { + RICaction_ToBeSetup_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_ToBeSetup_ItemIEs__value_PR_RICaction_ToBeSetup_Item +} RICaction_ToBeSetup_ItemIEs__value_PR; +typedef enum RICaction_Admitted_ItemIEs__value_PR { + RICaction_Admitted_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_Admitted_ItemIEs__value_PR_RICaction_Admitted_Item +} RICaction_Admitted_ItemIEs__value_PR; +typedef enum RICaction_NotAdmitted_ItemIEs__value_PR { + RICaction_NotAdmitted_ItemIEs__value_PR_NOTHING, /* No components present */ + RICaction_NotAdmitted_ItemIEs__value_PR_RICaction_NotAdmitted_Item +} RICaction_NotAdmitted_ItemIEs__value_PR; +typedef enum RANfunction_ItemIEs__value_PR { + RANfunction_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunction_ItemIEs__value_PR_RANfunction_Item +} RANfunction_ItemIEs__value_PR; +typedef enum RANfunctionID_ItemIEs__value_PR { + RANfunctionID_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunctionID_ItemIEs__value_PR_RANfunctionID_Item +} RANfunctionID_ItemIEs__value_PR; +typedef enum RANfunctionIDcause_ItemIEs__value_PR { + RANfunctionIDcause_ItemIEs__value_PR_NOTHING, /* No components present */ + RANfunctionIDcause_ItemIEs__value_PR_RANfunctionIDcause_Item +} RANfunctionIDcause_ItemIEs__value_PR; +typedef enum RICsubscriptionRequest_IEs__value_PR { + RICsubscriptionRequest_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionRequest_IEs__value_PR_RICrequestID, + RICsubscriptionRequest_IEs__value_PR_RANfunctionID, + RICsubscriptionRequest_IEs__value_PR_RICsubscriptionDetails +} RICsubscriptionRequest_IEs__value_PR; +typedef enum RICsubscriptionResponse_IEs__value_PR { + RICsubscriptionResponse_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionResponse_IEs__value_PR_RICrequestID, + RICsubscriptionResponse_IEs__value_PR_RANfunctionID, + RICsubscriptionResponse_IEs__value_PR_RICaction_Admitted_List, + RICsubscriptionResponse_IEs__value_PR_RICaction_NotAdmitted_List +} RICsubscriptionResponse_IEs__value_PR; +typedef enum RICsubscriptionFailure_IEs__value_PR { + RICsubscriptionFailure_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionFailure_IEs__value_PR_RICrequestID, + RICsubscriptionFailure_IEs__value_PR_RANfunctionID, + RICsubscriptionFailure_IEs__value_PR_RICaction_NotAdmitted_List, + RICsubscriptionFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICsubscriptionFailure_IEs__value_PR; +typedef enum RICsubscriptionDeleteRequest_IEs__value_PR { + RICsubscriptionDeleteRequest_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteRequest_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteRequest_IEs__value_PR_RANfunctionID +} RICsubscriptionDeleteRequest_IEs__value_PR; +typedef enum RICsubscriptionDeleteResponse_IEs__value_PR { + RICsubscriptionDeleteResponse_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteResponse_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteResponse_IEs__value_PR_RANfunctionID +} RICsubscriptionDeleteResponse_IEs__value_PR; +typedef enum RICsubscriptionDeleteFailure_IEs__value_PR { + RICsubscriptionDeleteFailure_IEs__value_PR_NOTHING, /* No components present */ + RICsubscriptionDeleteFailure_IEs__value_PR_RICrequestID, + RICsubscriptionDeleteFailure_IEs__value_PR_RANfunctionID, + RICsubscriptionDeleteFailure_IEs__value_PR_CauseE2, + RICsubscriptionDeleteFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICsubscriptionDeleteFailure_IEs__value_PR; +typedef enum RICindication_IEs__value_PR { + RICindication_IEs__value_PR_NOTHING, /* No components present */ + RICindication_IEs__value_PR_RICrequestID, + RICindication_IEs__value_PR_RANfunctionID, + RICindication_IEs__value_PR_RICactionID, + RICindication_IEs__value_PR_RICindicationSN, + RICindication_IEs__value_PR_RICindicationType, + RICindication_IEs__value_PR_RICindicationHeader, + RICindication_IEs__value_PR_RICindicationMessage, + RICindication_IEs__value_PR_RICcallProcessID +} RICindication_IEs__value_PR; +typedef enum RICcontrolRequest_IEs__value_PR { + RICcontrolRequest_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolRequest_IEs__value_PR_RICrequestID, + RICcontrolRequest_IEs__value_PR_RANfunctionID, + RICcontrolRequest_IEs__value_PR_RICcallProcessID, + RICcontrolRequest_IEs__value_PR_RICcontrolHeader, + RICcontrolRequest_IEs__value_PR_RICcontrolMessage, + RICcontrolRequest_IEs__value_PR_RICcontrolAckRequest +} RICcontrolRequest_IEs__value_PR; +typedef enum RICcontrolAcknowledge_IEs__value_PR { + RICcontrolAcknowledge_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolAcknowledge_IEs__value_PR_RICrequestID, + RICcontrolAcknowledge_IEs__value_PR_RANfunctionID, + RICcontrolAcknowledge_IEs__value_PR_RICcallProcessID, + RICcontrolAcknowledge_IEs__value_PR_RICcontrolStatus, + RICcontrolAcknowledge_IEs__value_PR_RICcontrolOutcome +} RICcontrolAcknowledge_IEs__value_PR; +typedef enum RICcontrolFailure_IEs__value_PR { + RICcontrolFailure_IEs__value_PR_NOTHING, /* No components present */ + RICcontrolFailure_IEs__value_PR_RICrequestID, + RICcontrolFailure_IEs__value_PR_RANfunctionID, + RICcontrolFailure_IEs__value_PR_RICcallProcessID, + RICcontrolFailure_IEs__value_PR_CauseE2, + RICcontrolFailure_IEs__value_PR_RICcontrolOutcome +} RICcontrolFailure_IEs__value_PR; +typedef enum ErrorIndicationE2_IEs__value_PR { + ErrorIndicationE2_IEs__value_PR_NOTHING, /* No components present */ + ErrorIndicationE2_IEs__value_PR_RICrequestID, + ErrorIndicationE2_IEs__value_PR_RANfunctionID, + ErrorIndicationE2_IEs__value_PR_CauseE2, + ErrorIndicationE2_IEs__value_PR_CriticalityDiagnosticsE2 +} ErrorIndicationE2_IEs__value_PR; +typedef enum E2setupRequestIEs__value_PR { + E2setupRequestIEs__value_PR_NOTHING, /* No components present */ + E2setupRequestIEs__value_PR_GlobalE2node_ID, + E2setupRequestIEs__value_PR_RANfunctions_List +} E2setupRequestIEs__value_PR; +typedef enum E2setupResponseIEs__value_PR { + E2setupResponseIEs__value_PR_NOTHING, /* No components present */ + E2setupResponseIEs__value_PR_GlobalRIC_ID, + E2setupResponseIEs__value_PR_RANfunctionsID_List, + E2setupResponseIEs__value_PR_RANfunctionsIDcause_List +} E2setupResponseIEs__value_PR; +typedef enum E2setupFailureIEs__value_PR { + E2setupFailureIEs__value_PR_NOTHING, /* No components present */ + E2setupFailureIEs__value_PR_CauseE2, + E2setupFailureIEs__value_PR_TimeToWaitE2, + E2setupFailureIEs__value_PR_CriticalityDiagnosticsE2 +} E2setupFailureIEs__value_PR; +typedef enum ResetRequestIEs__value_PR { + ResetRequestIEs__value_PR_NOTHING, /* No components present */ + ResetRequestIEs__value_PR_CauseE2 +} ResetRequestIEs__value_PR; +typedef enum ResetResponseIEs__value_PR { + ResetResponseIEs__value_PR_NOTHING, /* No components present */ + ResetResponseIEs__value_PR_CriticalityDiagnosticsE2 +} ResetResponseIEs__value_PR; +typedef enum RICserviceUpdate_IEs__value_PR { + RICserviceUpdate_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdate_IEs__value_PR_RANfunctions_List, + RICserviceUpdate_IEs__value_PR_RANfunctionsID_List +} RICserviceUpdate_IEs__value_PR; +typedef enum RICserviceUpdateAcknowledge_IEs__value_PR { + RICserviceUpdateAcknowledge_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsID_List, + RICserviceUpdateAcknowledge_IEs__value_PR_RANfunctionsIDcause_List +} RICserviceUpdateAcknowledge_IEs__value_PR; +typedef enum RICserviceUpdateFailure_IEs__value_PR { + RICserviceUpdateFailure_IEs__value_PR_NOTHING, /* No components present */ + RICserviceUpdateFailure_IEs__value_PR_RANfunctionsIDcause_List, + RICserviceUpdateFailure_IEs__value_PR_TimeToWaitE2, + RICserviceUpdateFailure_IEs__value_PR_CriticalityDiagnosticsE2 +} RICserviceUpdateFailure_IEs__value_PR; +typedef enum RICserviceQuery_IEs__value_PR { + RICserviceQuery_IEs__value_PR_NOTHING, /* No components present */ + RICserviceQuery_IEs__value_PR_RANfunctionsID_List +} RICserviceQuery_IEs__value_PR; + +/* ProtocolIE-FieldE2 */ +typedef struct RICaction_ToBeSetup_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_ToBeSetup_ItemIEs__value { + RICaction_ToBeSetup_ItemIEs__value_PR present; + union RICaction_ToBeSetup_ItemIEs__value_u { + RICaction_ToBeSetup_Item_t RICaction_ToBeSetup_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_ToBeSetup_ItemIEs_t; +typedef struct RICaction_Admitted_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_Admitted_ItemIEs__value { + RICaction_Admitted_ItemIEs__value_PR present; + union RICaction_Admitted_ItemIEs__value_u { + RICaction_Admitted_Item_t RICaction_Admitted_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_ItemIEs_t; +typedef struct RICaction_NotAdmitted_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICaction_NotAdmitted_ItemIEs__value { + RICaction_NotAdmitted_ItemIEs__value_PR present; + union RICaction_NotAdmitted_ItemIEs__value_u { + RICaction_NotAdmitted_Item_t RICaction_NotAdmitted_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_ItemIEs_t; +typedef struct RANfunction_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunction_ItemIEs__value { + RANfunction_ItemIEs__value_PR present; + union RANfunction_ItemIEs__value_u { + RANfunction_Item_t RANfunction_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunction_ItemIEs_t; +typedef struct RANfunctionID_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunctionID_ItemIEs__value { + RANfunctionID_ItemIEs__value_PR present; + union RANfunctionID_ItemIEs__value_u { + RANfunctionID_Item_t RANfunctionID_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionID_ItemIEs_t; +typedef struct RANfunctionIDcause_ItemIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RANfunctionIDcause_ItemIEs__value { + RANfunctionIDcause_ItemIEs__value_PR present; + union RANfunctionIDcause_ItemIEs__value_u { + RANfunctionIDcause_Item_t RANfunctionIDcause_Item; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionIDcause_ItemIEs_t; +typedef struct RICsubscriptionRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionRequest_IEs__value { + RICsubscriptionRequest_IEs__value_PR present; + union RICsubscriptionRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICsubscriptionDetails_t RICsubscriptionDetails; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionRequest_IEs_t; +typedef struct RICsubscriptionResponse_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionResponse_IEs__value { + RICsubscriptionResponse_IEs__value_PR present; + union RICsubscriptionResponse_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICaction_Admitted_List_t RICaction_Admitted_List; + RICaction_NotAdmitted_List_t RICaction_NotAdmitted_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionResponse_IEs_t; +typedef struct RICsubscriptionFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionFailure_IEs__value { + RICsubscriptionFailure_IEs__value_PR present; + union RICsubscriptionFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICaction_NotAdmitted_List_t RICaction_NotAdmitted_List; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionFailure_IEs_t; +typedef struct RICsubscriptionDeleteRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteRequest_IEs__value { + RICsubscriptionDeleteRequest_IEs__value_PR present; + union RICsubscriptionDeleteRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteRequest_IEs_t; +typedef struct RICsubscriptionDeleteResponse_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteResponse_IEs__value { + RICsubscriptionDeleteResponse_IEs__value_PR present; + union RICsubscriptionDeleteResponse_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteResponse_IEs_t; +typedef struct RICsubscriptionDeleteFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICsubscriptionDeleteFailure_IEs__value { + RICsubscriptionDeleteFailure_IEs__value_PR present; + union RICsubscriptionDeleteFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + CauseE2_t CauseE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteFailure_IEs_t; +typedef struct RICindication_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICindication_IEs__value { + RICindication_IEs__value_PR present; + union RICindication_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICactionID_t RICactionID; + RICindicationSN_t RICindicationSN; + RICindicationType_t RICindicationType; + RICindicationHeader_t RICindicationHeader; + RICindicationMessage_t RICindicationMessage; + RICcallProcessID_t RICcallProcessID; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICindication_IEs_t; +typedef struct RICcontrolRequest_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolRequest_IEs__value { + RICcontrolRequest_IEs__value_PR present; + union RICcontrolRequest_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + RICcontrolHeader_t RICcontrolHeader; + RICcontrolMessage_t RICcontrolMessage; + RICcontrolAckRequest_t RICcontrolAckRequest; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolRequest_IEs_t; +typedef struct RICcontrolAcknowledge_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolAcknowledge_IEs__value { + RICcontrolAcknowledge_IEs__value_PR present; + union RICcontrolAcknowledge_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + RICcontrolStatus_t RICcontrolStatus; + RICcontrolOutcome_t RICcontrolOutcome; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolAcknowledge_IEs_t; +typedef struct RICcontrolFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICcontrolFailure_IEs__value { + RICcontrolFailure_IEs__value_PR present; + union RICcontrolFailure_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + RICcallProcessID_t RICcallProcessID; + CauseE2_t CauseE2; + RICcontrolOutcome_t RICcontrolOutcome; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolFailure_IEs_t; +typedef struct ErrorIndicationE2_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ErrorIndicationE2_IEs__value { + ErrorIndicationE2_IEs__value_PR present; + union ErrorIndicationE2_IEs__value_u { + RICrequestID_t RICrequestID; + RANfunctionID_t RANfunctionID; + CauseE2_t CauseE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ErrorIndicationE2_IEs_t; +typedef struct E2setupRequestIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupRequestIEs__value { + E2setupRequestIEs__value_PR present; + union E2setupRequestIEs__value_u { + GlobalE2node_ID_t GlobalE2node_ID; + RANfunctions_List_t RANfunctions_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupRequestIEs_t; +typedef struct E2setupResponseIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupResponseIEs__value { + E2setupResponseIEs__value_PR present; + union E2setupResponseIEs__value_u { + GlobalRIC_ID_t GlobalRIC_ID; + RANfunctionsID_List_t RANfunctionsID_List; + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupResponseIEs_t; +typedef struct E2setupFailureIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct E2setupFailureIEs__value { + E2setupFailureIEs__value_PR present; + union E2setupFailureIEs__value_u { + CauseE2_t CauseE2; + TimeToWaitE2_t TimeToWaitE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} E2setupFailureIEs_t; +typedef struct ResetRequestIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ResetRequestIEs__value { + ResetRequestIEs__value_PR present; + union ResetRequestIEs__value_u { + CauseE2_t CauseE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetRequestIEs_t; +typedef struct ResetResponseIEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct ResetResponseIEs__value { + ResetResponseIEs__value_PR present; + union ResetResponseIEs__value_u { + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetResponseIEs_t; +typedef struct RICserviceUpdate_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdate_IEs__value { + RICserviceUpdate_IEs__value_PR present; + union RICserviceUpdate_IEs__value_u { + RANfunctions_List_t RANfunctions_List; + RANfunctionsID_List_t RANfunctionsID_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdate_IEs_t; +typedef struct RICserviceUpdateAcknowledge_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdateAcknowledge_IEs__value { + RICserviceUpdateAcknowledge_IEs__value_PR present; + union RICserviceUpdateAcknowledge_IEs__value_u { + RANfunctionsID_List_t RANfunctionsID_List; + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateAcknowledge_IEs_t; +typedef struct RICserviceUpdateFailure_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceUpdateFailure_IEs__value { + RICserviceUpdateFailure_IEs__value_PR present; + union RICserviceUpdateFailure_IEs__value_u { + RANfunctionsIDcause_List_t RANfunctionsIDcause_List; + TimeToWaitE2_t TimeToWaitE2; + CriticalityDiagnosticsE2_t CriticalityDiagnosticsE2; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateFailure_IEs_t; +typedef struct RICserviceQuery_IEs { + ProtocolIE_IDE2_t id; + CriticalityE2_t criticality; + struct RICserviceQuery_IEs__value { + RICserviceQuery_IEs__value_PR present; + union RICserviceQuery_IEs__value_u { + RANfunctionsID_List_t RANfunctionsID_List; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceQuery_IEs_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1; +extern asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_ItemIEs_1[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_ItemIEs_specs_5; +extern asn_TYPE_member_t asn_MBR_RICaction_Admitted_ItemIEs_5[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9; +extern asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_ItemIEs_9[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunction_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunction_ItemIEs_specs_13; +extern asn_TYPE_member_t asn_MBR_RANfunction_ItemIEs_13[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_ItemIEs_specs_17; +extern asn_TYPE_member_t asn_MBR_RANfunctionID_ItemIEs_17[3]; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_ItemIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_ItemIEs_specs_21; +extern asn_TYPE_member_t asn_MBR_RANfunctionIDcause_ItemIEs_21[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_IEs_specs_25; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_IEs_25[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_IEs_specs_29; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_IEs_29[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_IEs_specs_33; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_IEs_33[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_IEs_specs_37; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_IEs_37[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_IEs_specs_41; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_IEs_41[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_IEs_specs_45; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_IEs_45[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICindication_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_IEs_specs_49; +extern asn_TYPE_member_t asn_MBR_RICindication_IEs_49[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_IEs_specs_53; +extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_IEs_53[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_IEs_specs_57; +extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_IEs_57[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_IEs_specs_61; +extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_IEs_61[3]; +extern asn_TYPE_descriptor_t asn_DEF_ErrorIndicationE2_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ErrorIndicationE2_IEs_specs_65; +extern asn_TYPE_member_t asn_MBR_ErrorIndicationE2_IEs_65[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupRequestIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupRequestIEs_specs_69; +extern asn_TYPE_member_t asn_MBR_E2setupRequestIEs_69[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupResponseIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupResponseIEs_specs_73; +extern asn_TYPE_member_t asn_MBR_E2setupResponseIEs_73[3]; +extern asn_TYPE_descriptor_t asn_DEF_E2setupFailureIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_E2setupFailureIEs_specs_77; +extern asn_TYPE_member_t asn_MBR_E2setupFailureIEs_77[3]; +extern asn_TYPE_descriptor_t asn_DEF_ResetRequestIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequestIEs_specs_81; +extern asn_TYPE_member_t asn_MBR_ResetRequestIEs_81[3]; +extern asn_TYPE_descriptor_t asn_DEF_ResetResponseIEs; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponseIEs_specs_85; +extern asn_TYPE_member_t asn_MBR_ResetResponseIEs_85[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_IEs_specs_89; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_IEs_89[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_IEs_specs_93; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_IEs_93[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_IEs_specs_97; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_IEs_97[3]; +extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery_IEs; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_IEs_specs_101; +extern asn_TYPE_member_t asn_MBR_RICserviceQuery_IEs_101[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_FieldE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.c new file mode 100644 index 000000000..97f27971e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.c @@ -0,0 +1,9 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-FieldPairE2.h" + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.h new file mode 100644 index 000000000..bc44c61cd --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-FieldPairE2.h @@ -0,0 +1,23 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_FieldPairE2_H_ +#define _ProtocolIE_FieldPairE2_H_ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_FieldPairE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.c new file mode 100644 index 000000000..7e14d9a1e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-IDE2.h" + +int +ProtocolIE_IDE2_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_ProtocolIE_IDE2_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +asn_per_constraints_t asn_PER_type_ProtocolIE_IDE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_ProtocolIE_IDE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_IDE2 = { + "ProtocolIE-IDE2", + "ProtocolIE-IDE2", + &asn_OP_NativeInteger, + asn_DEF_ProtocolIE_IDE2_tags_1, + sizeof(asn_DEF_ProtocolIE_IDE2_tags_1) + /sizeof(asn_DEF_ProtocolIE_IDE2_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_IDE2_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_IDE2_tags_1) + /sizeof(asn_DEF_ProtocolIE_IDE2_tags_1[0]), /* 1 */ + { &asn_OER_type_ProtocolIE_IDE2_constr_1, &asn_PER_type_ProtocolIE_IDE2_constr_1, ProtocolIE_IDE2_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.h new file mode 100644 index 000000000..467b6eb2a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-IDE2.h @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_IDE2_H_ +#define _ProtocolIE_IDE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProtocolIE-IDE2 */ +typedef long ProtocolIE_IDE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_ProtocolIE_IDE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_IDE2; +asn_struct_free_f ProtocolIE_IDE2_free; +asn_struct_print_f ProtocolIE_IDE2_print; +asn_constr_check_f ProtocolIE_IDE2_constraint; +ber_type_decoder_f ProtocolIE_IDE2_decode_ber; +der_type_encoder_f ProtocolIE_IDE2_encode_der; +xer_type_decoder_f ProtocolIE_IDE2_decode_xer; +xer_type_encoder_f ProtocolIE_IDE2_encode_xer; +oer_type_decoder_f ProtocolIE_IDE2_decode_oer; +oer_type_encoder_f ProtocolIE_IDE2_encode_oer; +per_type_decoder_f ProtocolIE_IDE2_decode_uper; +per_type_encoder_f ProtocolIE_IDE2_encode_uper; +per_type_decoder_f ProtocolIE_IDE2_decode_aper; +per_type_encoder_f ProtocolIE_IDE2_encode_aper; +#define ProtocolIE_IDE2_id_CauseE2 ((ProtocolIE_IDE2_t)1) +#define ProtocolIE_IDE2_id_CriticalityDiagnosticsE2 ((ProtocolIE_IDE2_t)2) +#define ProtocolIE_IDE2_id_GlobalE2node_ID ((ProtocolIE_IDE2_t)3) +#define ProtocolIE_IDE2_id_GlobalRIC_ID ((ProtocolIE_IDE2_t)4) +#define ProtocolIE_IDE2_id_RANfunctionID ((ProtocolIE_IDE2_t)5) +#define ProtocolIE_IDE2_id_RANfunctionID_Item ((ProtocolIE_IDE2_t)6) +#define ProtocolIE_IDE2_id_RANfunctionIEcause_Item ((ProtocolIE_IDE2_t)7) +#define ProtocolIE_IDE2_id_RANfunction_Item ((ProtocolIE_IDE2_t)8) +#define ProtocolIE_IDE2_id_RANfunctionsAccepted ((ProtocolIE_IDE2_t)9) +#define ProtocolIE_IDE2_id_RANfunctionsAdded ((ProtocolIE_IDE2_t)10) +#define ProtocolIE_IDE2_id_RANfunctionsDeleted ((ProtocolIE_IDE2_t)11) +#define ProtocolIE_IDE2_id_RANfunctionsModified ((ProtocolIE_IDE2_t)12) +#define ProtocolIE_IDE2_id_RANfunctionsRejected ((ProtocolIE_IDE2_t)13) +#define ProtocolIE_IDE2_id_RICaction_Admitted_Item ((ProtocolIE_IDE2_t)14) +#define ProtocolIE_IDE2_id_RICactionID ((ProtocolIE_IDE2_t)15) +#define ProtocolIE_IDE2_id_RICaction_NotAdmitted_Item ((ProtocolIE_IDE2_t)16) +#define ProtocolIE_IDE2_id_RICactions_Admitted ((ProtocolIE_IDE2_t)17) +#define ProtocolIE_IDE2_id_RICactions_NotAdmitted ((ProtocolIE_IDE2_t)18) +#define ProtocolIE_IDE2_id_RICaction_ToBeSetup_Item ((ProtocolIE_IDE2_t)19) +#define ProtocolIE_IDE2_id_RICcallProcessID ((ProtocolIE_IDE2_t)20) +#define ProtocolIE_IDE2_id_RICcontrolAckRequest ((ProtocolIE_IDE2_t)21) +#define ProtocolIE_IDE2_id_RICcontrolHeader ((ProtocolIE_IDE2_t)22) +#define ProtocolIE_IDE2_id_RICcontrolMessage ((ProtocolIE_IDE2_t)23) +#define ProtocolIE_IDE2_id_RICcontrolStatus ((ProtocolIE_IDE2_t)24) +#define ProtocolIE_IDE2_id_RICindicationHeader ((ProtocolIE_IDE2_t)25) +#define ProtocolIE_IDE2_id_RICindicationMessage ((ProtocolIE_IDE2_t)26) +#define ProtocolIE_IDE2_id_RICindicationSN ((ProtocolIE_IDE2_t)27) +#define ProtocolIE_IDE2_id_RICindicationType ((ProtocolIE_IDE2_t)28) +#define ProtocolIE_IDE2_id_RICrequestID ((ProtocolIE_IDE2_t)29) +#define ProtocolIE_IDE2_id_RICsubscriptionDetails ((ProtocolIE_IDE2_t)30) +#define ProtocolIE_IDE2_id_TimeToWaitE2 ((ProtocolIE_IDE2_t)31) +#define ProtocolIE_IDE2_id_RICcontrolOutcome ((ProtocolIE_IDE2_t)32) + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_IDE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.c b/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.c new file mode 100644 index 000000000..e5f3df3fe --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.c @@ -0,0 +1,147 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ProtocolIE-SingleContainerE2.h" + +/* + * This type is implemented using RICaction_ToBeSetup_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RICaction_Admitted_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RICaction_NotAdmitted_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunction_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunctionID_ItemIEs, + * so here we adjust the DEF accordingly. + */ +/* + * This type is implemented using RANfunctionIDcause_ItemIEs, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P0_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_ItemIEs_1, + 3, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_ItemIEs_specs_1 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P1_tags_2[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_ItemIEs_5, + 3, /* Elements count */ + &asn_SPC_RICaction_Admitted_ItemIEs_specs_5 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P2_tags_3[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_ItemIEs_9, + 3, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_ItemIEs_specs_9 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P3_tags_4[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_ItemIEs_13, + 3, /* Elements count */ + &asn_SPC_RANfunction_ItemIEs_specs_13 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P4_tags_5[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_ItemIEs_17, + 3, /* Elements count */ + &asn_SPC_RANfunctionID_ItemIEs_specs_17 /* Additional specs */ +}; + +static const ber_tlv_tag_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5 = { + "ProtocolIE-SingleContainerE2", + "ProtocolIE-SingleContainerE2", + &asn_OP_SEQUENCE, + asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ + asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6, /* Same as above */ + sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6) + /sizeof(asn_DEF_ProtocolIE_SingleContainerE2_1410P5_tags_6[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_ItemIEs_21, + 3, /* Elements count */ + &asn_SPC_RANfunctionIDcause_ItemIEs_specs_21 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.h b/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.h new file mode 100644 index 000000000..8ce37aa60 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ProtocolIE-SingleContainerE2.h @@ -0,0 +1,120 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-Containers" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ProtocolIE_SingleContainerE2_H_ +#define _ProtocolIE_SingleContainerE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-FieldE2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* ProtocolIE-SingleContainerE2 */ +typedef RICaction_ToBeSetup_ItemIEs_t ProtocolIE_SingleContainerE2_1410P0_t; +typedef RICaction_Admitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P1_t; +typedef RICaction_NotAdmitted_ItemIEs_t ProtocolIE_SingleContainerE2_1410P2_t; +typedef RANfunction_ItemIEs_t ProtocolIE_SingleContainerE2_1410P3_t; +typedef RANfunctionID_ItemIEs_t ProtocolIE_SingleContainerE2_1410P4_t; +typedef RANfunctionIDcause_ItemIEs_t ProtocolIE_SingleContainerE2_1410P5_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P0; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P0_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P0_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P0_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P0_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P0_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P1; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P1_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P1_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P1_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P1_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P1_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P2; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P2_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P2_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P2_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P2_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P2_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P3; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P3_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P3_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P3_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P3_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P3_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P4; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P4_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P4_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P4_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P4_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P4_encode_aper; +extern asn_TYPE_descriptor_t asn_DEF_ProtocolIE_SingleContainerE2_1410P5; +asn_struct_free_f ProtocolIE_SingleContainerE2_1410P5_free; +asn_struct_print_f ProtocolIE_SingleContainerE2_1410P5_print; +asn_constr_check_f ProtocolIE_SingleContainerE2_1410P5_constraint; +ber_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_ber; +der_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_der; +xer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_xer; +xer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_xer; +oer_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_oer; +oer_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_oer; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_uper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_uper; +per_type_decoder_f ProtocolIE_SingleContainerE2_1410P5_decode_aper; +per_type_encoder_f ProtocolIE_SingleContainerE2_1410P5_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _ProtocolIE_SingleContainerE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunction-Item.c b/src/codec_utils/E2AP_OLD1/RANfunction-Item.c new file mode 100644 index 000000000..bf53aca18 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunction-Item.c @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunction-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunction_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionDefinition), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionDefinition" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunction_Item, ranFunctionRevision), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionRevision, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionRevision" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunction_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunction_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ranFunctionDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* ranFunctionRevision */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunction_Item_specs_1 = { + sizeof(struct RANfunction_Item), + offsetof(struct RANfunction_Item, _asn_ctx), + asn_MAP_RANfunction_Item_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 3, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunction_Item = { + "RANfunction-Item", + "RANfunction-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunction_Item_tags_1, + sizeof(asn_DEF_RANfunction_Item_tags_1) + /sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunction_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunction_Item_tags_1) + /sizeof(asn_DEF_RANfunction_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunction_Item_1, + 3, /* Elements count */ + &asn_SPC_RANfunction_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunction-Item.h b/src/codec_utils/E2AP_OLD1/RANfunction-Item.h new file mode 100644 index 000000000..5e2eb14c8 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunction-Item.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunction_Item_H_ +#define _RANfunction_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "RANfunctionDefinition.h" +#include "RANfunctionRevision.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunction-Item */ +typedef struct RANfunction_Item { + RANfunctionID_t ranFunctionID; + RANfunctionDefinition_t ranFunctionDefinition; + RANfunctionRevision_t ranFunctionRevision; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunction_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunction_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunction_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.c b/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.c new file mode 100644 index 000000000..bc0a7ccef --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RANfunctionDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition = { + "RANfunctionDefinition", + "RANfunctionDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RANfunctionDefinition_tags_1, + sizeof(asn_DEF_RANfunctionDefinition_tags_1) + /sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionDefinition_tags_1) + /sizeof(asn_DEF_RANfunctionDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.h b/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.h new file mode 100644 index 000000000..2329fe6ca --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionDefinition_H_ +#define _RANfunctionDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionDefinition */ +typedef OCTET_STRING_t RANfunctionDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionDefinition; +asn_struct_free_f RANfunctionDefinition_free; +asn_struct_print_f RANfunctionDefinition_print; +asn_constr_check_f RANfunctionDefinition_constraint; +ber_type_decoder_f RANfunctionDefinition_decode_ber; +der_type_encoder_f RANfunctionDefinition_encode_der; +xer_type_decoder_f RANfunctionDefinition_decode_xer; +xer_type_encoder_f RANfunctionDefinition_encode_xer; +oer_type_decoder_f RANfunctionDefinition_decode_oer; +oer_type_encoder_f RANfunctionDefinition_encode_oer; +per_type_decoder_f RANfunctionDefinition_decode_uper; +per_type_encoder_f RANfunctionDefinition_encode_uper; +per_type_decoder_f RANfunctionDefinition_decode_aper; +per_type_encoder_f RANfunctionDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.c b/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.c new file mode 100644 index 000000000..53bea0aa4 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionID-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunctionID_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionID_Item, ranFunctionRevision), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionRevision, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionRevision" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionID_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ranFunctionRevision */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionID_Item_specs_1 = { + sizeof(struct RANfunctionID_Item), + offsetof(struct RANfunctionID_Item, _asn_ctx), + asn_MAP_RANfunctionID_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item = { + "RANfunctionID-Item", + "RANfunctionID-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionID_Item_tags_1, + sizeof(asn_DEF_RANfunctionID_Item_tags_1) + /sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionID_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_Item_tags_1) + /sizeof(asn_DEF_RANfunctionID_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionID_Item_1, + 2, /* Elements count */ + &asn_SPC_RANfunctionID_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.h b/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.h new file mode 100644 index 000000000..a787c712f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionID-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionID_Item_H_ +#define _RANfunctionID_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "RANfunctionRevision.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionID-Item */ +typedef struct RANfunctionID_Item { + RANfunctionID_t ranFunctionID; + RANfunctionRevision_t ranFunctionRevision; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionID_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionID_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionID.c b/src/codec_utils/E2AP_OLD1/RANfunctionID.c new file mode 100644 index 000000000..dc77a8213 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionID.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionID.h" + +int +RANfunctionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 4095)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RANfunctionID_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..4095) */, + -1}; +asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionID = { + "RANfunctionID", + "RANfunctionID", + &asn_OP_NativeInteger, + asn_DEF_RANfunctionID_tags_1, + sizeof(asn_DEF_RANfunctionID_tags_1) + /sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionID_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionID_tags_1) + /sizeof(asn_DEF_RANfunctionID_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionID_constr_1, &asn_PER_type_RANfunctionID_constr_1, RANfunctionID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionID.h b/src/codec_utils/E2AP_OLD1/RANfunctionID.h new file mode 100644 index 000000000..3e1c08e43 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionID_H_ +#define _RANfunctionID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionID */ +typedef long RANfunctionID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RANfunctionID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionID; +asn_struct_free_f RANfunctionID_free; +asn_struct_print_f RANfunctionID_print; +asn_constr_check_f RANfunctionID_constraint; +ber_type_decoder_f RANfunctionID_decode_ber; +der_type_encoder_f RANfunctionID_encode_der; +xer_type_decoder_f RANfunctionID_decode_xer; +xer_type_encoder_f RANfunctionID_encode_xer; +oer_type_decoder_f RANfunctionID_decode_oer; +oer_type_encoder_f RANfunctionID_encode_oer; +per_type_decoder_f RANfunctionID_decode_uper; +per_type_encoder_f RANfunctionID_encode_uper; +per_type_decoder_f RANfunctionID_decode_aper; +per_type_encoder_f RANfunctionID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.c b/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.c new file mode 100644 index 000000000..64c6782ae --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionIDcause-Item.h" + +static asn_TYPE_member_t asn_MBR_RANfunctionIDcause_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, ranFunctionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RANfunctionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ranFunctionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RANfunctionIDcause_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionIDcause_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RANfunctionIDcause_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ranFunctionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RANfunctionIDcause_Item_specs_1 = { + sizeof(struct RANfunctionIDcause_Item), + offsetof(struct RANfunctionIDcause_Item, _asn_ctx), + asn_MAP_RANfunctionIDcause_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item = { + "RANfunctionIDcause-Item", + "RANfunctionIDcause-Item", + &asn_OP_SEQUENCE, + asn_DEF_RANfunctionIDcause_Item_tags_1, + sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1) + /sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionIDcause_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1) + /sizeof(asn_DEF_RANfunctionIDcause_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RANfunctionIDcause_Item_1, + 2, /* Elements count */ + &asn_SPC_RANfunctionIDcause_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.h b/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.h new file mode 100644 index 000000000..f967404be --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionIDcause-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionIDcause_Item_H_ +#define _RANfunctionIDcause_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RANfunctionID.h" +#include "CauseE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionIDcause-Item */ +typedef struct RANfunctionIDcause_Item { + RANfunctionID_t ranFunctionID; + CauseE2_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionIDcause_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionIDcause_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionIDcause_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionRevision.c b/src/codec_utils/E2AP_OLD1/RANfunctionRevision.c new file mode 100644 index 000000000..46215d699 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionRevision.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionRevision.h" + +int +RANfunctionRevision_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 4095)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RANfunctionRevision_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..4095) */, + -1}; +asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 12, 12, 0, 4095 } /* (0..4095) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionRevision_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision = { + "RANfunctionRevision", + "RANfunctionRevision", + &asn_OP_NativeInteger, + asn_DEF_RANfunctionRevision_tags_1, + sizeof(asn_DEF_RANfunctionRevision_tags_1) + /sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionRevision_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionRevision_tags_1) + /sizeof(asn_DEF_RANfunctionRevision_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionRevision_constr_1, &asn_PER_type_RANfunctionRevision_constr_1, RANfunctionRevision_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionRevision.h b/src/codec_utils/E2AP_OLD1/RANfunctionRevision.h new file mode 100644 index 000000000..f31677084 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionRevision.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionRevision_H_ +#define _RANfunctionRevision_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RANfunctionRevision */ +typedef long RANfunctionRevision_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RANfunctionRevision_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionRevision; +asn_struct_free_f RANfunctionRevision_free; +asn_struct_print_f RANfunctionRevision_print; +asn_constr_check_f RANfunctionRevision_constraint; +ber_type_decoder_f RANfunctionRevision_decode_ber; +der_type_encoder_f RANfunctionRevision_encode_der; +xer_type_decoder_f RANfunctionRevision_decode_xer; +xer_type_encoder_f RANfunctionRevision_encode_xer; +oer_type_decoder_f RANfunctionRevision_decode_oer; +oer_type_encoder_f RANfunctionRevision_encode_oer; +per_type_decoder_f RANfunctionRevision_decode_uper; +per_type_encoder_f RANfunctionRevision_encode_uper; +per_type_decoder_f RANfunctionRevision_decode_aper; +per_type_encoder_f RANfunctionRevision_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionRevision_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctions-List.c b/src/codec_utils/E2AP_OLD1/RANfunctions-List.c new file mode 100644 index 000000000..6414f6c93 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctions-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctions-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctions_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctions_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctions_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctions_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctions_List_specs_1 = { + sizeof(struct RANfunctions_List), + offsetof(struct RANfunctions_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctions_List = { + "RANfunctions-List", + "RANfunctions-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctions_List_tags_1, + sizeof(asn_DEF_RANfunctions_List_tags_1) + /sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctions_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctions_List_tags_1) + /sizeof(asn_DEF_RANfunctions_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctions_List_constr_1, &asn_PER_type_RANfunctions_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctions_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctions_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctions-List.h b/src/codec_utils/E2AP_OLD1/RANfunctions-List.h new file mode 100644 index 000000000..e90722b42 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctions-List.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctions_List_H_ +#define _RANfunctions_List_H_ + + +#include +//#include "ProtocolIE_SingleContainerE2.h" + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctions-List */ +typedef struct RANfunctions_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P3_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctions_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctions_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctions_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.c b/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.c new file mode 100644 index 000000000..5d3f1262d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionsID-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctionsID_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctionsID_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P4, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionsID_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctionsID_List_specs_1 = { + sizeof(struct RANfunctionsID_List), + offsetof(struct RANfunctionsID_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List = { + "RANfunctionsID-List", + "RANfunctionsID-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctionsID_List_tags_1, + sizeof(asn_DEF_RANfunctionsID_List_tags_1) + /sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionsID_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionsID_List_tags_1) + /sizeof(asn_DEF_RANfunctionsID_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionsID_List_constr_1, &asn_PER_type_RANfunctionsID_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctionsID_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctionsID_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.h b/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.h new file mode 100644 index 000000000..381c4f424 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionsID-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionsID_List_H_ +#define _RANfunctionsID_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctionsID-List */ +typedef struct RANfunctionsID_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P4_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionsID_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsID_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionsID_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.c b/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.c new file mode 100644 index 000000000..a0bf56eb7 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RANfunctionsIDcause-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..256)) */}; +static asn_per_constraints_t asn_PER_type_RANfunctionsIDcause_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 9, 9, 0, 256 } /* (SIZE(0..256)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RANfunctionsIDcause_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P5, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RANfunctionsIDcause_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RANfunctionsIDcause_List_specs_1 = { + sizeof(struct RANfunctionsIDcause_List), + offsetof(struct RANfunctionsIDcause_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List = { + "RANfunctionsIDcause-List", + "RANfunctionsIDcause-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RANfunctionsIDcause_List_tags_1, + sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1) + /sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */ + asn_DEF_RANfunctionsIDcause_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1) + /sizeof(asn_DEF_RANfunctionsIDcause_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RANfunctionsIDcause_List_constr_1, &asn_PER_type_RANfunctionsIDcause_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RANfunctionsIDcause_List_1, + 1, /* Single element */ + &asn_SPC_RANfunctionsIDcause_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.h b/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.h new file mode 100644 index 000000000..02de48210 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RANfunctionsIDcause-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RANfunctionsIDcause_List_H_ +#define _RANfunctionsIDcause_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RANfunctionsIDcause-List */ +typedef struct RANfunctionsIDcause_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P5_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RANfunctionsIDcause_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RANfunctionsIDcause_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RANfunctionsIDcause_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.c b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.c new file mode 100644 index 000000000..7d22606f6 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-Admitted-Item.h" + +static asn_TYPE_member_t asn_MBR_RICaction_Admitted_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_Admitted_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_Admitted_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ricActionID */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_Admitted_Item_specs_1 = { + sizeof(struct RICaction_Admitted_Item), + offsetof(struct RICaction_Admitted_Item, _asn_ctx), + asn_MAP_RICaction_Admitted_Item_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item = { + "RICaction-Admitted-Item", + "RICaction-Admitted-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_Admitted_Item_tags_1, + sizeof(asn_DEF_RICaction_Admitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_Admitted_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_Admitted_Item_1, + 1, /* Elements count */ + &asn_SPC_RICaction_Admitted_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.h b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.h new file mode 100644 index 000000000..ce84e2983 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-Item.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_Admitted_Item_H_ +#define _RICaction_Admitted_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICaction-Admitted-Item */ +typedef struct RICaction_Admitted_Item { + RICactionID_t ricActionID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_Admitted_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.c b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.c new file mode 100644 index 000000000..4b47c173f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-Admitted-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..16)) */}; +static asn_per_constraints_t asn_PER_type_RICaction_Admitted_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RICaction_Admitted_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_Admitted_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RICaction_Admitted_List_specs_1 = { + sizeof(struct RICaction_Admitted_List), + offsetof(struct RICaction_Admitted_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List = { + "RICaction-Admitted-List", + "RICaction-Admitted-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICaction_Admitted_List_tags_1, + sizeof(asn_DEF_RICaction_Admitted_List_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */ + asn_DEF_RICaction_Admitted_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_Admitted_List_tags_1) + /sizeof(asn_DEF_RICaction_Admitted_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICaction_Admitted_List_constr_1, &asn_PER_type_RICaction_Admitted_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICaction_Admitted_List_1, + 1, /* Single element */ + &asn_SPC_RICaction_Admitted_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.h b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.h new file mode 100644 index 000000000..858d6abf5 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-Admitted-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_Admitted_List_H_ +#define _RICaction_Admitted_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICaction-Admitted-List */ +typedef struct RICaction_Admitted_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P1_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_Admitted_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_Admitted_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_Admitted_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.c b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.c new file mode 100644 index 000000000..376f43d78 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-NotAdmitted-Item.h" + +static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_NotAdmitted_Item, cause), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_CauseE2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "cause" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_NotAdmitted_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cause */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_NotAdmitted_Item_specs_1 = { + sizeof(struct RICaction_NotAdmitted_Item), + offsetof(struct RICaction_NotAdmitted_Item, _asn_ctx), + asn_MAP_RICaction_NotAdmitted_Item_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item = { + "RICaction-NotAdmitted-Item", + "RICaction-NotAdmitted-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_NotAdmitted_Item_tags_1, + sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_NotAdmitted_Item_1, + 2, /* Elements count */ + &asn_SPC_RICaction_NotAdmitted_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.h b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.h new file mode 100644 index 000000000..7c43e7f8e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-Item.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_NotAdmitted_Item_H_ +#define _RICaction_NotAdmitted_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include "CauseE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICaction-NotAdmitted-Item */ +typedef struct RICaction_NotAdmitted_Item { + RICactionID_t ricActionID; + CauseE2_t cause; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_NotAdmitted_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.c b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.c new file mode 100644 index 000000000..c5f3ba4b3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-NotAdmitted-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(0..16)) */}; +static asn_per_constraints_t asn_PER_type_RICaction_NotAdmitted_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 5, 5, 0, 16 } /* (SIZE(0..16)) */, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_RICaction_NotAdmitted_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICaction_NotAdmitted_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_RICaction_NotAdmitted_List_specs_1 = { + sizeof(struct RICaction_NotAdmitted_List), + offsetof(struct RICaction_NotAdmitted_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List = { + "RICaction-NotAdmitted-List", + "RICaction-NotAdmitted-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICaction_NotAdmitted_List_tags_1, + sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */ + asn_DEF_RICaction_NotAdmitted_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1) + /sizeof(asn_DEF_RICaction_NotAdmitted_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICaction_NotAdmitted_List_constr_1, &asn_PER_type_RICaction_NotAdmitted_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICaction_NotAdmitted_List_1, + 1, /* Single element */ + &asn_SPC_RICaction_NotAdmitted_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.h b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.h new file mode 100644 index 000000000..3b146f644 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-NotAdmitted-List.h @@ -0,0 +1,41 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_NotAdmitted_List_H_ +#define _RICaction_NotAdmitted_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICaction-NotAdmitted-List */ +typedef struct RICaction_NotAdmitted_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_NotAdmitted_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_NotAdmitted_List; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_NotAdmitted_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.c b/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.c new file mode 100644 index 000000000..cecdcd423 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.c @@ -0,0 +1,83 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICaction-ToBeSetup-Item.h" + +#include "RICsubsequentAction.h" +static asn_TYPE_member_t asn_MBR_RICaction_ToBeSetup_Item_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionID, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICaction_ToBeSetup_Item, ricActionType), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionType" + }, + { ATF_POINTER, 2, offsetof(struct RICaction_ToBeSetup_Item, ricActionDefinition), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactionDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricActionDefinition" + }, + { ATF_POINTER, 1, offsetof(struct RICaction_ToBeSetup_Item, ricSubsequentAction), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICsubsequentAction, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricSubsequentAction" + }, +}; +static const int asn_MAP_RICaction_ToBeSetup_Item_oms_1[] = { 2, 3 }; +static const ber_tlv_tag_t asn_DEF_RICaction_ToBeSetup_Item_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICaction_ToBeSetup_Item_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricActionID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ricActionType */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* ricActionDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* ricSubsequentAction */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICaction_ToBeSetup_Item_specs_1 = { + sizeof(struct RICaction_ToBeSetup_Item), + offsetof(struct RICaction_ToBeSetup_Item, _asn_ctx), + asn_MAP_RICaction_ToBeSetup_Item_tag2el_1, + 4, /* Count of tags in the map */ + asn_MAP_RICaction_ToBeSetup_Item_oms_1, /* Optional members */ + 2, 0, /* Root/Additions */ + 4, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item = { + "RICaction-ToBeSetup-Item", + "RICaction-ToBeSetup-Item", + &asn_OP_SEQUENCE, + asn_DEF_RICaction_ToBeSetup_Item_tags_1, + sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */ + asn_DEF_RICaction_ToBeSetup_Item_tags_1, /* Same as above */ + sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1) + /sizeof(asn_DEF_RICaction_ToBeSetup_Item_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICaction_ToBeSetup_Item_1, + 4, /* Elements count */ + &asn_SPC_RICaction_ToBeSetup_Item_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.h b/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.h new file mode 100644 index 000000000..5003dcf72 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICaction-ToBeSetup-Item.h @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICaction_ToBeSetup_Item_H_ +#define _RICaction_ToBeSetup_Item_H_ + + +#include + +/* Including external dependencies */ +#include "RICactionID.h" +#include "RICactionType.h" +#include "RICactionDefinition.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct RICsubsequentAction; + +/* RICaction-ToBeSetup-Item */ +typedef struct RICaction_ToBeSetup_Item { + RICactionID_t ricActionID; + RICactionType_t ricActionType; + RICactionDefinition_t *ricActionDefinition; /* OPTIONAL */ + struct RICsubsequentAction *ricSubsequentAction; /* OPTIONAL */ + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICaction_ToBeSetup_Item_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICaction_ToBeSetup_Item; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICaction_ToBeSetup_Item_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICactionDefinition.c b/src/codec_utils/E2AP_OLD1/RICactionDefinition.c new file mode 100644 index 000000000..c8600b3c3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICactionDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionDefinition = { + "RICactionDefinition", + "RICactionDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RICactionDefinition_tags_1, + sizeof(asn_DEF_RICactionDefinition_tags_1) + /sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */ + asn_DEF_RICactionDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionDefinition_tags_1) + /sizeof(asn_DEF_RICactionDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICactionDefinition.h b/src/codec_utils/E2AP_OLD1/RICactionDefinition.h new file mode 100644 index 000000000..9822a347b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionDefinition_H_ +#define _RICactionDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICactionDefinition */ +typedef OCTET_STRING_t RICactionDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICactionDefinition; +asn_struct_free_f RICactionDefinition_free; +asn_struct_print_f RICactionDefinition_print; +asn_constr_check_f RICactionDefinition_constraint; +ber_type_decoder_f RICactionDefinition_decode_ber; +der_type_encoder_f RICactionDefinition_encode_der; +xer_type_decoder_f RICactionDefinition_decode_xer; +xer_type_encoder_f RICactionDefinition_encode_xer; +oer_type_decoder_f RICactionDefinition_decode_oer; +oer_type_encoder_f RICactionDefinition_encode_oer; +per_type_decoder_f RICactionDefinition_decode_uper; +per_type_encoder_f RICactionDefinition_encode_uper; +per_type_decoder_f RICactionDefinition_decode_aper; +per_type_encoder_f RICactionDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICactionID.c b/src/codec_utils/E2AP_OLD1/RICactionID.c new file mode 100644 index 000000000..25b71fefa --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionID.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionID.h" + +int +RICactionID_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICactionID_constr_1 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +asn_per_constraints_t asn_PER_type_RICactionID_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RICactionID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionID = { + "RICactionID", + "RICactionID", + &asn_OP_NativeInteger, + asn_DEF_RICactionID_tags_1, + sizeof(asn_DEF_RICactionID_tags_1) + /sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */ + asn_DEF_RICactionID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionID_tags_1) + /sizeof(asn_DEF_RICactionID_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactionID_constr_1, &asn_PER_type_RICactionID_constr_1, RICactionID_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICactionID.h b/src/codec_utils/E2AP_OLD1/RICactionID.h new file mode 100644 index 000000000..b058d8e39 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionID.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionID_H_ +#define _RICactionID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICactionID */ +typedef long RICactionID_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICactionID_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICactionID; +asn_struct_free_f RICactionID_free; +asn_struct_print_f RICactionID_print; +asn_constr_check_f RICactionID_constraint; +ber_type_decoder_f RICactionID_decode_ber; +der_type_encoder_f RICactionID_encode_der; +xer_type_decoder_f RICactionID_decode_xer; +xer_type_encoder_f RICactionID_encode_xer; +oer_type_decoder_f RICactionID_decode_oer; +oer_type_encoder_f RICactionID_encode_oer; +per_type_decoder_f RICactionID_decode_uper; +per_type_encoder_f RICactionID_encode_uper; +per_type_decoder_f RICactionID_decode_aper; +per_type_encoder_f RICactionID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICactionType.c b/src/codec_utils/E2AP_OLD1/RICactionType.c new file mode 100644 index 000000000..f4cb0cf43 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionType.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactionType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICactionType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICactionType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICactionType_value2enum_1[] = { + { 0, 6, "report" }, + { 1, 6, "insert" }, + { 2, 6, "policy" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICactionType_enum2value_1[] = { + 1, /* insert(1) */ + 2, /* policy(2) */ + 0 /* report(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1 = { + asn_MAP_RICactionType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICactionType_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICactionType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICactionType = { + "RICactionType", + "RICactionType", + &asn_OP_NativeEnumerated, + asn_DEF_RICactionType_tags_1, + sizeof(asn_DEF_RICactionType_tags_1) + /sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */ + asn_DEF_RICactionType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactionType_tags_1) + /sizeof(asn_DEF_RICactionType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactionType_constr_1, &asn_PER_type_RICactionType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICactionType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICactionType.h b/src/codec_utils/E2AP_OLD1/RICactionType.h new file mode 100644 index 000000000..89f402fa1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactionType.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactionType_H_ +#define _RICactionType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICactionType { + RICactionType_report = 0, + RICactionType_insert = 1, + RICactionType_policy = 2 + /* + * Enumeration is extensible + */ +} e_RICactionType; + +/* RICactionType */ +typedef long RICactionType_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICactionType_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICactionType; +extern const asn_INTEGER_specifics_t asn_SPC_RICactionType_specs_1; +asn_struct_free_f RICactionType_free; +asn_struct_print_f RICactionType_print; +asn_constr_check_f RICactionType_constraint; +ber_type_decoder_f RICactionType_decode_ber; +der_type_encoder_f RICactionType_encode_der; +xer_type_decoder_f RICactionType_decode_xer; +xer_type_encoder_f RICactionType_encode_xer; +oer_type_decoder_f RICactionType_decode_oer; +oer_type_encoder_f RICactionType_encode_oer; +per_type_decoder_f RICactionType_decode_uper; +per_type_encoder_f RICactionType_encode_uper; +per_type_decoder_f RICactionType_decode_aper; +per_type_encoder_f RICactionType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactionType_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.c b/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.c new file mode 100644 index 000000000..2439ca781 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.c @@ -0,0 +1,53 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICactions-ToBeSetup-List.h" + +#include "ProtocolIE-SingleContainerE2.h" +static asn_oer_constraints_t asn_OER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1 /* (SIZE(1..16)) */}; +asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_CONSTRAINED, 4, 4, 1, 16 } /* (SIZE(1..16)) */, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[] = { + { ATF_POINTER, 0, 0, + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ProtocolIE_SingleContainerE2_1410P0, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICactions_ToBeSetup_List_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1 = { + sizeof(struct RICactions_ToBeSetup_List), + offsetof(struct RICactions_ToBeSetup_List, _asn_ctx), + 0, /* XER encoding is XMLDelimitedItemList */ +}; +asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List = { + "RICactions-ToBeSetup-List", + "RICactions-ToBeSetup-List", + &asn_OP_SEQUENCE_OF, + asn_DEF_RICactions_ToBeSetup_List_tags_1, + sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1) + /sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */ + asn_DEF_RICactions_ToBeSetup_List_tags_1, /* Same as above */ + sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1) + /sizeof(asn_DEF_RICactions_ToBeSetup_List_tags_1[0]), /* 1 */ + { &asn_OER_type_RICactions_ToBeSetup_List_constr_1, &asn_PER_type_RICactions_ToBeSetup_List_constr_1, SEQUENCE_OF_constraint }, + asn_MBR_RICactions_ToBeSetup_List_1, + 1, /* Single element */ + &asn_SPC_RICactions_ToBeSetup_List_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.h b/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.h new file mode 100644 index 000000000..6ece2f122 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICactions-ToBeSetup-List.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICactions_ToBeSetup_List_H_ +#define _RICactions_ToBeSetup_List_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct ProtocolIE_SingleContainerE2; + +/* RICactions-ToBeSetup-List */ +typedef struct RICactions_ToBeSetup_List { + A_SEQUENCE_OF(struct ProtocolIE_SingleContainerE2_1410P0_t) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICactions_ToBeSetup_List_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICactions_ToBeSetup_List; +extern asn_SET_OF_specifics_t asn_SPC_RICactions_ToBeSetup_List_specs_1; +extern asn_TYPE_member_t asn_MBR_RICactions_ToBeSetup_List_1[1]; +extern asn_per_constraints_t asn_PER_type_RICactions_ToBeSetup_List_constr_1; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICactions_ToBeSetup_List_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcallProcessID.c b/src/codec_utils/E2AP_OLD1/RICcallProcessID.c new file mode 100644 index 000000000..b1caab37d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcallProcessID.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcallProcessID.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcallProcessID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcallProcessID = { + "RICcallProcessID", + "RICcallProcessID", + &asn_OP_OCTET_STRING, + asn_DEF_RICcallProcessID_tags_1, + sizeof(asn_DEF_RICcallProcessID_tags_1) + /sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */ + asn_DEF_RICcallProcessID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcallProcessID_tags_1) + /sizeof(asn_DEF_RICcallProcessID_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcallProcessID.h b/src/codec_utils/E2AP_OLD1/RICcallProcessID.h new file mode 100644 index 000000000..8d06076a5 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcallProcessID.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcallProcessID_H_ +#define _RICcallProcessID_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcallProcessID */ +typedef OCTET_STRING_t RICcallProcessID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcallProcessID; +asn_struct_free_f RICcallProcessID_free; +asn_struct_print_f RICcallProcessID_print; +asn_constr_check_f RICcallProcessID_constraint; +ber_type_decoder_f RICcallProcessID_decode_ber; +der_type_encoder_f RICcallProcessID_encode_der; +xer_type_decoder_f RICcallProcessID_decode_xer; +xer_type_encoder_f RICcallProcessID_encode_xer; +oer_type_decoder_f RICcallProcessID_decode_oer; +oer_type_encoder_f RICcallProcessID_encode_oer; +per_type_decoder_f RICcallProcessID_decode_uper; +per_type_encoder_f RICcallProcessID_encode_uper; +per_type_decoder_f RICcallProcessID_decode_aper; +per_type_encoder_f RICcallProcessID_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcallProcessID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.c b/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.c new file mode 100644 index 000000000..8ef27b7c9 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolAckRequest.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICcontrolAckRequest_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolAckRequest_value2enum_1[] = { + { 0, 5, "noAck" }, + { 1, 3, "ack" }, + { 2, 4, "nAck" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICcontrolAckRequest_enum2value_1[] = { + 1, /* ack(1) */ + 2, /* nAck(2) */ + 0 /* noAck(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICcontrolAckRequest_specs_1 = { + asn_MAP_RICcontrolAckRequest_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICcontrolAckRequest_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAckRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest = { + "RICcontrolAckRequest", + "RICcontrolAckRequest", + &asn_OP_NativeEnumerated, + asn_DEF_RICcontrolAckRequest_tags_1, + sizeof(asn_DEF_RICcontrolAckRequest_tags_1) + /sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolAckRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolAckRequest_tags_1) + /sizeof(asn_DEF_RICcontrolAckRequest_tags_1[0]), /* 1 */ + { &asn_OER_type_RICcontrolAckRequest_constr_1, &asn_PER_type_RICcontrolAckRequest_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICcontrolAckRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.h b/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.h new file mode 100644 index 000000000..73ef88a0b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolAckRequest.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolAckRequest_H_ +#define _RICcontrolAckRequest_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICcontrolAckRequest { + RICcontrolAckRequest_noAck = 0, + RICcontrolAckRequest_ack = 1, + RICcontrolAckRequest_nAck = 2 + /* + * Enumeration is extensible + */ +} e_RICcontrolAckRequest; + +/* RICcontrolAckRequest */ +typedef long RICcontrolAckRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAckRequest; +asn_struct_free_f RICcontrolAckRequest_free; +asn_struct_print_f RICcontrolAckRequest_print; +asn_constr_check_f RICcontrolAckRequest_constraint; +ber_type_decoder_f RICcontrolAckRequest_decode_ber; +der_type_encoder_f RICcontrolAckRequest_encode_der; +xer_type_decoder_f RICcontrolAckRequest_decode_xer; +xer_type_encoder_f RICcontrolAckRequest_encode_xer; +oer_type_decoder_f RICcontrolAckRequest_decode_oer; +oer_type_encoder_f RICcontrolAckRequest_encode_oer; +per_type_decoder_f RICcontrolAckRequest_decode_uper; +per_type_encoder_f RICcontrolAckRequest_encode_uper; +per_type_decoder_f RICcontrolAckRequest_decode_aper; +per_type_encoder_f RICcontrolAckRequest_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolAckRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.c b/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.c new file mode 100644 index 000000000..a4cb659cb --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolAcknowledge.h" + +asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P8, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1 = { + sizeof(struct RICcontrolAcknowledge), + offsetof(struct RICcontrolAcknowledge, _asn_ctx), + asn_MAP_RICcontrolAcknowledge_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge = { + "RICcontrolAcknowledge", + "RICcontrolAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolAcknowledge_tags_1, + sizeof(asn_DEF_RICcontrolAcknowledge_tags_1) + /sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolAcknowledge_tags_1) + /sizeof(asn_DEF_RICcontrolAcknowledge_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.h b/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.h new file mode 100644 index 000000000..a288d3563 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolAcknowledge_H_ +#define _RICcontrolAcknowledge_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolAcknowledge */ +typedef struct RICcontrolAcknowledge { + ProtocolIE_ContainerE2_1407P8_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolAcknowledge_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolFailure.c b/src/codec_utils/E2AP_OLD1/RICcontrolFailure.c new file mode 100644 index 000000000..ee6affe82 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolFailure.h" + +asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P9, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1 = { + sizeof(struct RICcontrolFailure), + offsetof(struct RICcontrolFailure, _asn_ctx), + asn_MAP_RICcontrolFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure = { + "RICcontrolFailure", + "RICcontrolFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolFailure_tags_1, + sizeof(asn_DEF_RICcontrolFailure_tags_1) + /sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolFailure_tags_1) + /sizeof(asn_DEF_RICcontrolFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolFailure_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolFailure.h b/src/codec_utils/E2AP_OLD1/RICcontrolFailure.h new file mode 100644 index 000000000..5659bb6c5 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolFailure_H_ +#define _RICcontrolFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolFailure */ +typedef struct RICcontrolFailure { + ProtocolIE_ContainerE2_1407P9_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolHeader.c b/src/codec_utils/E2AP_OLD1/RICcontrolHeader.c new file mode 100644 index 000000000..01449fe2e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolHeader.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolHeader.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolHeader_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader = { + "RICcontrolHeader", + "RICcontrolHeader", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolHeader_tags_1, + sizeof(asn_DEF_RICcontrolHeader_tags_1) + /sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolHeader_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolHeader_tags_1) + /sizeof(asn_DEF_RICcontrolHeader_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolHeader.h b/src/codec_utils/E2AP_OLD1/RICcontrolHeader.h new file mode 100644 index 000000000..f73fd59ef --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolHeader.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolHeader_H_ +#define _RICcontrolHeader_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolHeader */ +typedef OCTET_STRING_t RICcontrolHeader_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolHeader; +asn_struct_free_f RICcontrolHeader_free; +asn_struct_print_f RICcontrolHeader_print; +asn_constr_check_f RICcontrolHeader_constraint; +ber_type_decoder_f RICcontrolHeader_decode_ber; +der_type_encoder_f RICcontrolHeader_encode_der; +xer_type_decoder_f RICcontrolHeader_decode_xer; +xer_type_encoder_f RICcontrolHeader_encode_xer; +oer_type_decoder_f RICcontrolHeader_decode_oer; +oer_type_encoder_f RICcontrolHeader_encode_oer; +per_type_decoder_f RICcontrolHeader_decode_uper; +per_type_encoder_f RICcontrolHeader_encode_uper; +per_type_decoder_f RICcontrolHeader_decode_aper; +per_type_encoder_f RICcontrolHeader_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolHeader_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolMessage.c b/src/codec_utils/E2AP_OLD1/RICcontrolMessage.c new file mode 100644 index 000000000..f073a04bb --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolMessage.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolMessage.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolMessage_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage = { + "RICcontrolMessage", + "RICcontrolMessage", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolMessage_tags_1, + sizeof(asn_DEF_RICcontrolMessage_tags_1) + /sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolMessage_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolMessage_tags_1) + /sizeof(asn_DEF_RICcontrolMessage_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolMessage.h b/src/codec_utils/E2AP_OLD1/RICcontrolMessage.h new file mode 100644 index 000000000..05d608e8b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolMessage.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolMessage_H_ +#define _RICcontrolMessage_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolMessage */ +typedef OCTET_STRING_t RICcontrolMessage_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolMessage; +asn_struct_free_f RICcontrolMessage_free; +asn_struct_print_f RICcontrolMessage_print; +asn_constr_check_f RICcontrolMessage_constraint; +ber_type_decoder_f RICcontrolMessage_decode_ber; +der_type_encoder_f RICcontrolMessage_encode_der; +xer_type_decoder_f RICcontrolMessage_decode_xer; +xer_type_encoder_f RICcontrolMessage_encode_xer; +oer_type_decoder_f RICcontrolMessage_decode_oer; +oer_type_encoder_f RICcontrolMessage_encode_oer; +per_type_decoder_f RICcontrolMessage_decode_uper; +per_type_encoder_f RICcontrolMessage_encode_uper; +per_type_decoder_f RICcontrolMessage_decode_aper; +per_type_encoder_f RICcontrolMessage_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolMessage_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.c b/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.c new file mode 100644 index 000000000..388a53500 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolOutcome.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICcontrolOutcome_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome = { + "RICcontrolOutcome", + "RICcontrolOutcome", + &asn_OP_OCTET_STRING, + asn_DEF_RICcontrolOutcome_tags_1, + sizeof(asn_DEF_RICcontrolOutcome_tags_1) + /sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolOutcome_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolOutcome_tags_1) + /sizeof(asn_DEF_RICcontrolOutcome_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.h b/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.h new file mode 100644 index 000000000..92396ceb0 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolOutcome.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolOutcome_H_ +#define _RICcontrolOutcome_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolOutcome */ +typedef OCTET_STRING_t RICcontrolOutcome_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolOutcome; +asn_struct_free_f RICcontrolOutcome_free; +asn_struct_print_f RICcontrolOutcome_print; +asn_constr_check_f RICcontrolOutcome_constraint; +ber_type_decoder_f RICcontrolOutcome_decode_ber; +der_type_encoder_f RICcontrolOutcome_encode_der; +xer_type_decoder_f RICcontrolOutcome_decode_xer; +xer_type_encoder_f RICcontrolOutcome_encode_xer; +oer_type_decoder_f RICcontrolOutcome_decode_oer; +oer_type_encoder_f RICcontrolOutcome_encode_oer; +per_type_decoder_f RICcontrolOutcome_decode_uper; +per_type_encoder_f RICcontrolOutcome_encode_uper; +per_type_decoder_f RICcontrolOutcome_decode_aper; +per_type_encoder_f RICcontrolOutcome_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolOutcome_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolRequest.c b/src/codec_utils/E2AP_OLD1/RICcontrolRequest.c new file mode 100644 index 000000000..f326e050d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolRequest.h" + +asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICcontrolRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P7, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICcontrolRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1 = { + sizeof(struct RICcontrolRequest), + offsetof(struct RICcontrolRequest, _asn_ctx), + asn_MAP_RICcontrolRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest = { + "RICcontrolRequest", + "RICcontrolRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICcontrolRequest_tags_1, + sizeof(asn_DEF_RICcontrolRequest_tags_1) + /sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolRequest_tags_1) + /sizeof(asn_DEF_RICcontrolRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICcontrolRequest_1, + 1, /* Elements count */ + &asn_SPC_RICcontrolRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolRequest.h b/src/codec_utils/E2AP_OLD1/RICcontrolRequest.h new file mode 100644 index 000000000..9f35b5d9e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolRequest_H_ +#define _RICcontrolRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICcontrolRequest */ +typedef struct RICcontrolRequest { + ProtocolIE_ContainerE2_1407P7_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICcontrolRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICcontrolRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICcontrolRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolStatus.c b/src/codec_utils/E2AP_OLD1/RICcontrolStatus.c new file mode 100644 index 000000000..73e3356c6 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolStatus.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICcontrolStatus.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICcontrolStatus_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICcontrolStatus_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICcontrolStatus_value2enum_1[] = { + { 0, 7, "success" }, + { 1, 8, "rejected" }, + { 2, 6, "failed" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICcontrolStatus_enum2value_1[] = { + 2, /* failed(2) */ + 1, /* rejected(1) */ + 0 /* success(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICcontrolStatus_specs_1 = { + asn_MAP_RICcontrolStatus_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICcontrolStatus_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 4, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICcontrolStatus_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus = { + "RICcontrolStatus", + "RICcontrolStatus", + &asn_OP_NativeEnumerated, + asn_DEF_RICcontrolStatus_tags_1, + sizeof(asn_DEF_RICcontrolStatus_tags_1) + /sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */ + asn_DEF_RICcontrolStatus_tags_1, /* Same as above */ + sizeof(asn_DEF_RICcontrolStatus_tags_1) + /sizeof(asn_DEF_RICcontrolStatus_tags_1[0]), /* 1 */ + { &asn_OER_type_RICcontrolStatus_constr_1, &asn_PER_type_RICcontrolStatus_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICcontrolStatus_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICcontrolStatus.h b/src/codec_utils/E2AP_OLD1/RICcontrolStatus.h new file mode 100644 index 000000000..95711c697 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICcontrolStatus.h @@ -0,0 +1,55 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICcontrolStatus_H_ +#define _RICcontrolStatus_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICcontrolStatus { + RICcontrolStatus_success = 0, + RICcontrolStatus_rejected = 1, + RICcontrolStatus_failed = 2 + /* + * Enumeration is extensible + */ +} e_RICcontrolStatus; + +/* RICcontrolStatus */ +typedef long RICcontrolStatus_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICcontrolStatus; +asn_struct_free_f RICcontrolStatus_free; +asn_struct_print_f RICcontrolStatus_print; +asn_constr_check_f RICcontrolStatus_constraint; +ber_type_decoder_f RICcontrolStatus_decode_ber; +der_type_encoder_f RICcontrolStatus_encode_der; +xer_type_decoder_f RICcontrolStatus_decode_xer; +xer_type_encoder_f RICcontrolStatus_encode_xer; +oer_type_decoder_f RICcontrolStatus_decode_oer; +oer_type_encoder_f RICcontrolStatus_encode_oer; +per_type_decoder_f RICcontrolStatus_decode_uper; +per_type_encoder_f RICcontrolStatus_encode_uper; +per_type_decoder_f RICcontrolStatus_decode_aper; +per_type_encoder_f RICcontrolStatus_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICcontrolStatus_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.c b/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.c new file mode 100644 index 000000000..f4eb284cf --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICeventTriggerDefinition.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICeventTriggerDefinition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition = { + "RICeventTriggerDefinition", + "RICeventTriggerDefinition", + &asn_OP_OCTET_STRING, + asn_DEF_RICeventTriggerDefinition_tags_1, + sizeof(asn_DEF_RICeventTriggerDefinition_tags_1) + /sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */ + asn_DEF_RICeventTriggerDefinition_tags_1, /* Same as above */ + sizeof(asn_DEF_RICeventTriggerDefinition_tags_1) + /sizeof(asn_DEF_RICeventTriggerDefinition_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.h b/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.h new file mode 100644 index 000000000..635908cc8 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICeventTriggerDefinition.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICeventTriggerDefinition_H_ +#define _RICeventTriggerDefinition_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICeventTriggerDefinition */ +typedef OCTET_STRING_t RICeventTriggerDefinition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICeventTriggerDefinition; +asn_struct_free_f RICeventTriggerDefinition_free; +asn_struct_print_f RICeventTriggerDefinition_print; +asn_constr_check_f RICeventTriggerDefinition_constraint; +ber_type_decoder_f RICeventTriggerDefinition_decode_ber; +der_type_encoder_f RICeventTriggerDefinition_encode_der; +xer_type_decoder_f RICeventTriggerDefinition_decode_xer; +xer_type_encoder_f RICeventTriggerDefinition_encode_xer; +oer_type_decoder_f RICeventTriggerDefinition_decode_oer; +oer_type_encoder_f RICeventTriggerDefinition_encode_oer; +per_type_decoder_f RICeventTriggerDefinition_decode_uper; +per_type_encoder_f RICeventTriggerDefinition_encode_uper; +per_type_decoder_f RICeventTriggerDefinition_decode_aper; +per_type_encoder_f RICeventTriggerDefinition_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICeventTriggerDefinition_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICindication.c b/src/codec_utils/E2AP_OLD1/RICindication.c new file mode 100644 index 000000000..10376a879 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindication.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindication.h" + +asn_TYPE_member_t asn_MBR_RICindication_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICindication, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P6, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICindication_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICindication_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1 = { + sizeof(struct RICindication), + offsetof(struct RICindication, _asn_ctx), + asn_MAP_RICindication_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICindication = { + "RICindication", + "RICindication", + &asn_OP_SEQUENCE, + asn_DEF_RICindication_tags_1, + sizeof(asn_DEF_RICindication_tags_1) + /sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */ + asn_DEF_RICindication_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindication_tags_1) + /sizeof(asn_DEF_RICindication_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICindication_1, + 1, /* Elements count */ + &asn_SPC_RICindication_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICindication.h b/src/codec_utils/E2AP_OLD1/RICindication.h new file mode 100644 index 000000000..d4d170a71 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindication.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindication_H_ +#define _RICindication_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindication */ +typedef struct RICindication { + ProtocolIE_ContainerE2_1407P6_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICindication_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindication; +extern asn_SEQUENCE_specifics_t asn_SPC_RICindication_specs_1; +extern asn_TYPE_member_t asn_MBR_RICindication_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindication_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICindicationHeader.c b/src/codec_utils/E2AP_OLD1/RICindicationHeader.c new file mode 100644 index 000000000..feed94e7a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationHeader.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationHeader.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICindicationHeader_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationHeader = { + "RICindicationHeader", + "RICindicationHeader", + &asn_OP_OCTET_STRING, + asn_DEF_RICindicationHeader_tags_1, + sizeof(asn_DEF_RICindicationHeader_tags_1) + /sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */ + asn_DEF_RICindicationHeader_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationHeader_tags_1) + /sizeof(asn_DEF_RICindicationHeader_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICindicationHeader.h b/src/codec_utils/E2AP_OLD1/RICindicationHeader.h new file mode 100644 index 000000000..1164809fc --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationHeader.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationHeader_H_ +#define _RICindicationHeader_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationHeader */ +typedef OCTET_STRING_t RICindicationHeader_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationHeader; +asn_struct_free_f RICindicationHeader_free; +asn_struct_print_f RICindicationHeader_print; +asn_constr_check_f RICindicationHeader_constraint; +ber_type_decoder_f RICindicationHeader_decode_ber; +der_type_encoder_f RICindicationHeader_encode_der; +xer_type_decoder_f RICindicationHeader_decode_xer; +xer_type_encoder_f RICindicationHeader_encode_xer; +oer_type_decoder_f RICindicationHeader_decode_oer; +oer_type_encoder_f RICindicationHeader_encode_oer; +per_type_decoder_f RICindicationHeader_decode_uper; +per_type_encoder_f RICindicationHeader_encode_uper; +per_type_decoder_f RICindicationHeader_decode_aper; +per_type_encoder_f RICindicationHeader_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationHeader_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICindicationMessage.c b/src/codec_utils/E2AP_OLD1/RICindicationMessage.c new file mode 100644 index 000000000..e9c74dc3b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationMessage.c @@ -0,0 +1,31 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationMessage.h" + +/* + * This type is implemented using OCTET_STRING, + * so here we adjust the DEF accordingly. + */ +static const ber_tlv_tag_t asn_DEF_RICindicationMessage_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationMessage = { + "RICindicationMessage", + "RICindicationMessage", + &asn_OP_OCTET_STRING, + asn_DEF_RICindicationMessage_tags_1, + sizeof(asn_DEF_RICindicationMessage_tags_1) + /sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */ + asn_DEF_RICindicationMessage_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationMessage_tags_1) + /sizeof(asn_DEF_RICindicationMessage_tags_1[0]), /* 1 */ + { 0, 0, OCTET_STRING_constraint }, + 0, 0, /* No members */ + &asn_SPC_OCTET_STRING_specs /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICindicationMessage.h b/src/codec_utils/E2AP_OLD1/RICindicationMessage.h new file mode 100644 index 000000000..82e7608b3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationMessage.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationMessage_H_ +#define _RICindicationMessage_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationMessage */ +typedef OCTET_STRING_t RICindicationMessage_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationMessage; +asn_struct_free_f RICindicationMessage_free; +asn_struct_print_f RICindicationMessage_print; +asn_constr_check_f RICindicationMessage_constraint; +ber_type_decoder_f RICindicationMessage_decode_ber; +der_type_encoder_f RICindicationMessage_encode_der; +xer_type_decoder_f RICindicationMessage_decode_xer; +xer_type_encoder_f RICindicationMessage_encode_xer; +oer_type_decoder_f RICindicationMessage_decode_oer; +oer_type_encoder_f RICindicationMessage_encode_oer; +per_type_decoder_f RICindicationMessage_decode_uper; +per_type_encoder_f RICindicationMessage_encode_uper; +per_type_decoder_f RICindicationMessage_decode_aper; +per_type_encoder_f RICindicationMessage_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationMessage_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICindicationSN.c b/src/codec_utils/E2AP_OLD1/RICindicationSN.c new file mode 100644 index 000000000..8afca171e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationSN.c @@ -0,0 +1,64 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationSN.h" + +int +RICindicationSN_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICindicationSN_constr_1 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_type_RICindicationSN_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const ber_tlv_tag_t asn_DEF_RICindicationSN_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationSN = { + "RICindicationSN", + "RICindicationSN", + &asn_OP_NativeInteger, + asn_DEF_RICindicationSN_tags_1, + sizeof(asn_DEF_RICindicationSN_tags_1) + /sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */ + asn_DEF_RICindicationSN_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationSN_tags_1) + /sizeof(asn_DEF_RICindicationSN_tags_1[0]), /* 1 */ + { &asn_OER_type_RICindicationSN_constr_1, &asn_PER_type_RICindicationSN_constr_1, RICindicationSN_constraint }, + 0, 0, /* No members */ + 0 /* No specifics */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICindicationSN.h b/src/codec_utils/E2AP_OLD1/RICindicationSN.h new file mode 100644 index 000000000..1c7167293 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationSN.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationSN_H_ +#define _RICindicationSN_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICindicationSN */ +typedef long RICindicationSN_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationSN; +asn_struct_free_f RICindicationSN_free; +asn_struct_print_f RICindicationSN_print; +asn_constr_check_f RICindicationSN_constraint; +ber_type_decoder_f RICindicationSN_decode_ber; +der_type_encoder_f RICindicationSN_encode_der; +xer_type_decoder_f RICindicationSN_decode_xer; +xer_type_encoder_f RICindicationSN_encode_xer; +oer_type_decoder_f RICindicationSN_decode_oer; +oer_type_encoder_f RICindicationSN_encode_oer; +per_type_decoder_f RICindicationSN_decode_uper; +per_type_encoder_f RICindicationSN_encode_uper; +per_type_decoder_f RICindicationSN_decode_aper; +per_type_encoder_f RICindicationSN_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationSN_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICindicationType.c b/src/codec_utils/E2AP_OLD1/RICindicationType.c new file mode 100644 index 000000000..a00907e95 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationType.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICindicationType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICindicationType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_RICindicationType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICindicationType_value2enum_1[] = { + { 0, 6, "report" }, + { 1, 6, "insert" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICindicationType_enum2value_1[] = { + 1, /* insert(1) */ + 0 /* report(0) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_RICindicationType_specs_1 = { + asn_MAP_RICindicationType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICindicationType_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICindicationType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICindicationType = { + "RICindicationType", + "RICindicationType", + &asn_OP_NativeEnumerated, + asn_DEF_RICindicationType_tags_1, + sizeof(asn_DEF_RICindicationType_tags_1) + /sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */ + asn_DEF_RICindicationType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICindicationType_tags_1) + /sizeof(asn_DEF_RICindicationType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICindicationType_constr_1, &asn_PER_type_RICindicationType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICindicationType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICindicationType.h b/src/codec_utils/E2AP_OLD1/RICindicationType.h new file mode 100644 index 000000000..23614b934 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICindicationType.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICindicationType_H_ +#define _RICindicationType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICindicationType { + RICindicationType_report = 0, + RICindicationType_insert = 1 + /* + * Enumeration is extensible + */ +} e_RICindicationType; + +/* RICindicationType */ +typedef long RICindicationType_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICindicationType; +asn_struct_free_f RICindicationType_free; +asn_struct_print_f RICindicationType_print; +asn_constr_check_f RICindicationType_constraint; +ber_type_decoder_f RICindicationType_decode_ber; +der_type_encoder_f RICindicationType_encode_der; +xer_type_decoder_f RICindicationType_decode_xer; +xer_type_encoder_f RICindicationType_encode_xer; +oer_type_decoder_f RICindicationType_decode_oer; +oer_type_encoder_f RICindicationType_encode_oer; +per_type_decoder_f RICindicationType_decode_uper; +per_type_encoder_f RICindicationType_encode_uper; +per_type_decoder_f RICindicationType_decode_aper; +per_type_encoder_f RICindicationType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICindicationType_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICrequestID.c b/src/codec_utils/E2AP_OLD1/RICrequestID.c new file mode 100644 index 000000000..2e34c8da4 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICrequestID.c @@ -0,0 +1,126 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICrequestID.h" + +static int +memb_ricRequestorID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_ricInstanceID_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_oer_constraints_t asn_OER_memb_ricRequestorID_constr_2 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ricRequestorID_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_ricInstanceID_constr_3 CC_NOTUSED = { + { 2, 1 } /* (0..65535) */, + -1}; +static asn_per_constraints_t asn_PER_memb_ricInstanceID_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 16, 16, 0, 65535 } /* (0..65535) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +asn_TYPE_member_t asn_MBR_RICrequestID_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricRequestorID), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ricRequestorID_constr_2, &asn_PER_memb_ricRequestorID_constr_2, memb_ricRequestorID_constraint_1 }, + 0, 0, /* No default value */ + "ricRequestorID" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICrequestID, ricInstanceID), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { &asn_OER_memb_ricInstanceID_constr_3, &asn_PER_memb_ricInstanceID_constr_3, memb_ricInstanceID_constraint_1 }, + 0, 0, /* No default value */ + "ricInstanceID" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICrequestID_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICrequestID_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricRequestorID */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricInstanceID */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1 = { + sizeof(struct RICrequestID), + offsetof(struct RICrequestID, _asn_ctx), + asn_MAP_RICrequestID_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICrequestID = { + "RICrequestID", + "RICrequestID", + &asn_OP_SEQUENCE, + asn_DEF_RICrequestID_tags_1, + sizeof(asn_DEF_RICrequestID_tags_1) + /sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */ + asn_DEF_RICrequestID_tags_1, /* Same as above */ + sizeof(asn_DEF_RICrequestID_tags_1) + /sizeof(asn_DEF_RICrequestID_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICrequestID_1, + 2, /* Elements count */ + &asn_SPC_RICrequestID_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICrequestID.h b/src/codec_utils/E2AP_OLD1/RICrequestID.h new file mode 100644 index 000000000..2114a7c9a --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICrequestID.h @@ -0,0 +1,45 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICrequestID_H_ +#define _RICrequestID_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICrequestID */ +typedef struct RICrequestID { + long ricRequestorID; + long ricInstanceID; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICrequestID_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICrequestID; +extern asn_SEQUENCE_specifics_t asn_SPC_RICrequestID_specs_1; +extern asn_TYPE_member_t asn_MBR_RICrequestID_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICrequestID_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICserviceQuery.c b/src/codec_utils/E2AP_OLD1/RICserviceQuery.c new file mode 100644 index 000000000..6cdf79711 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceQuery.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceQuery.h" + +asn_TYPE_member_t asn_MBR_RICserviceQuery_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceQuery, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P19, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceQuery_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceQuery_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1 = { + sizeof(struct RICserviceQuery), + offsetof(struct RICserviceQuery, _asn_ctx), + asn_MAP_RICserviceQuery_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceQuery = { + "RICserviceQuery", + "RICserviceQuery", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceQuery_tags_1, + sizeof(asn_DEF_RICserviceQuery_tags_1) + /sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */ + asn_DEF_RICserviceQuery_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceQuery_tags_1) + /sizeof(asn_DEF_RICserviceQuery_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceQuery_1, + 1, /* Elements count */ + &asn_SPC_RICserviceQuery_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICserviceQuery.h b/src/codec_utils/E2AP_OLD1/RICserviceQuery.h new file mode 100644 index 000000000..454412976 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceQuery.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceQuery_H_ +#define _RICserviceQuery_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceQuery */ +typedef struct RICserviceQuery { + ProtocolIE_ContainerE2_1407P19_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceQuery_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceQuery; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceQuery_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceQuery_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceQuery_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdate.c b/src/codec_utils/E2AP_OLD1/RICserviceUpdate.c new file mode 100644 index 000000000..34224756c --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdate.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdate.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdate, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P16, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdate_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdate_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1 = { + sizeof(struct RICserviceUpdate), + offsetof(struct RICserviceUpdate, _asn_ctx), + asn_MAP_RICserviceUpdate_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate = { + "RICserviceUpdate", + "RICserviceUpdate", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdate_tags_1, + sizeof(asn_DEF_RICserviceUpdate_tags_1) + /sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdate_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdate_tags_1) + /sizeof(asn_DEF_RICserviceUpdate_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdate_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdate_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdate.h b/src/codec_utils/E2AP_OLD1/RICserviceUpdate.h new file mode 100644 index 000000000..a817b3d25 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdate.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdate_H_ +#define _RICserviceUpdate_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdate */ +typedef struct RICserviceUpdate { + ProtocolIE_ContainerE2_1407P16_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdate_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdate; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdate_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdate_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdate_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.c b/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.c new file mode 100644 index 000000000..debb9463f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdateAcknowledge.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateAcknowledge, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P17, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateAcknowledge_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateAcknowledge_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1 = { + sizeof(struct RICserviceUpdateAcknowledge), + offsetof(struct RICserviceUpdateAcknowledge, _asn_ctx), + asn_MAP_RICserviceUpdateAcknowledge_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge = { + "RICserviceUpdateAcknowledge", + "RICserviceUpdateAcknowledge", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateAcknowledge_tags_1, + sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdateAcknowledge_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1) + /sizeof(asn_DEF_RICserviceUpdateAcknowledge_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateAcknowledge_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdateAcknowledge_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.h b/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.h new file mode 100644 index 000000000..b6927a00f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdateAcknowledge.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdateAcknowledge_H_ +#define _RICserviceUpdateAcknowledge_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdateAcknowledge */ +typedef struct RICserviceUpdateAcknowledge { + ProtocolIE_ContainerE2_1407P17_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateAcknowledge_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateAcknowledge; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateAcknowledge_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateAcknowledge_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdateAcknowledge_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.c b/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.c new file mode 100644 index 000000000..cef1a5ef3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICserviceUpdateFailure.h" + +asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICserviceUpdateFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P18, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICserviceUpdateFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICserviceUpdateFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1 = { + sizeof(struct RICserviceUpdateFailure), + offsetof(struct RICserviceUpdateFailure, _asn_ctx), + asn_MAP_RICserviceUpdateFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure = { + "RICserviceUpdateFailure", + "RICserviceUpdateFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICserviceUpdateFailure_tags_1, + sizeof(asn_DEF_RICserviceUpdateFailure_tags_1) + /sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */ + asn_DEF_RICserviceUpdateFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICserviceUpdateFailure_tags_1) + /sizeof(asn_DEF_RICserviceUpdateFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICserviceUpdateFailure_1, + 1, /* Elements count */ + &asn_SPC_RICserviceUpdateFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.h b/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.h new file mode 100644 index 000000000..9b636392f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICserviceUpdateFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICserviceUpdateFailure_H_ +#define _RICserviceUpdateFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICserviceUpdateFailure */ +typedef struct RICserviceUpdateFailure { + ProtocolIE_ContainerE2_1407P18_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICserviceUpdateFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICserviceUpdateFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICserviceUpdateFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICserviceUpdateFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICserviceUpdateFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.c new file mode 100644 index 000000000..41752ec2b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteFailure.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P5, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1 = { + sizeof(struct RICsubscriptionDeleteFailure), + offsetof(struct RICsubscriptionDeleteFailure, _asn_ctx), + asn_MAP_RICsubscriptionDeleteFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure = { + "RICsubscriptionDeleteFailure", + "RICsubscriptionDeleteFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteFailure_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteFailure_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.h new file mode 100644 index 000000000..407f66d77 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteFailure_H_ +#define _RICsubscriptionDeleteFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteFailure */ +typedef struct RICsubscriptionDeleteFailure { + ProtocolIE_ContainerE2_1407P5_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.c new file mode 100644 index 000000000..baf2f2770 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteRequest.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P3, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1 = { + sizeof(struct RICsubscriptionDeleteRequest), + offsetof(struct RICsubscriptionDeleteRequest, _asn_ctx), + asn_MAP_RICsubscriptionDeleteRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest = { + "RICsubscriptionDeleteRequest", + "RICsubscriptionDeleteRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteRequest_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteRequest_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.h new file mode 100644 index 000000000..ec2aaf0a1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteRequest_H_ +#define _RICsubscriptionDeleteRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteRequest */ +typedef struct RICsubscriptionDeleteRequest { + ProtocolIE_ContainerE2_1407P3_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.c new file mode 100644 index 000000000..187e8baeb --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDeleteResponse.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDeleteResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P4, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDeleteResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDeleteResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1 = { + sizeof(struct RICsubscriptionDeleteResponse), + offsetof(struct RICsubscriptionDeleteResponse, _asn_ctx), + asn_MAP_RICsubscriptionDeleteResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse = { + "RICsubscriptionDeleteResponse", + "RICsubscriptionDeleteResponse", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDeleteResponse_tags_1, + sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDeleteResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionDeleteResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDeleteResponse_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionDeleteResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.h new file mode 100644 index 000000000..a601a4332 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDeleteResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDeleteResponse_H_ +#define _RICsubscriptionDeleteResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDeleteResponse */ +typedef struct RICsubscriptionDeleteResponse { + ProtocolIE_ContainerE2_1407P4_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDeleteResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDeleteResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDeleteResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionDeleteResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDeleteResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.c new file mode 100644 index 000000000..064be1ad0 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionDetails.h" + +static asn_TYPE_member_t asn_MBR_RICsubscriptionDetails_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricEventTriggerDefinition), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICeventTriggerDefinition, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricEventTriggerDefinition" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionDetails, ricAction_ToBeSetup_List), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICactions_ToBeSetup_List, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricAction-ToBeSetup-List" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionDetails_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionDetails_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricEventTriggerDefinition */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricAction-ToBeSetup-List */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionDetails_specs_1 = { + sizeof(struct RICsubscriptionDetails), + offsetof(struct RICsubscriptionDetails, _asn_ctx), + asn_MAP_RICsubscriptionDetails_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails = { + "RICsubscriptionDetails", + "RICsubscriptionDetails", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionDetails_tags_1, + sizeof(asn_DEF_RICsubscriptionDetails_tags_1) + /sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionDetails_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionDetails_tags_1) + /sizeof(asn_DEF_RICsubscriptionDetails_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionDetails_1, + 2, /* Elements count */ + &asn_SPC_RICsubscriptionDetails_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.h new file mode 100644 index 000000000..e25d8662c --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionDetails.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionDetails_H_ +#define _RICsubscriptionDetails_H_ + + +#include + +/* Including external dependencies */ +#include "RICeventTriggerDefinition.h" +#include "RICactions-ToBeSetup-List.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionDetails */ +typedef struct RICsubscriptionDetails { + RICeventTriggerDefinition_t ricEventTriggerDefinition; + RICactions_ToBeSetup_List_t ricAction_ToBeSetup_List; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionDetails_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionDetails; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionDetails_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.c new file mode 100644 index 000000000..141a5a1f7 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionFailure.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionFailure, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P2, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionFailure_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionFailure_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1 = { + sizeof(struct RICsubscriptionFailure), + offsetof(struct RICsubscriptionFailure, _asn_ctx), + asn_MAP_RICsubscriptionFailure_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure = { + "RICsubscriptionFailure", + "RICsubscriptionFailure", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionFailure_tags_1, + sizeof(asn_DEF_RICsubscriptionFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionFailure_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionFailure_tags_1) + /sizeof(asn_DEF_RICsubscriptionFailure_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionFailure_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionFailure_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.h new file mode 100644 index 000000000..a0ba284bd --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionFailure.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionFailure_H_ +#define _RICsubscriptionFailure_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionFailure */ +typedef struct RICsubscriptionFailure { + ProtocolIE_ContainerE2_1407P2_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionFailure_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionFailure; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionFailure_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionFailure_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionFailure_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.c new file mode 100644 index 000000000..5a9a020ad --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionRequest.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P0, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1 = { + sizeof(struct RICsubscriptionRequest), + offsetof(struct RICsubscriptionRequest, _asn_ctx), + asn_MAP_RICsubscriptionRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest = { + "RICsubscriptionRequest", + "RICsubscriptionRequest", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionRequest_tags_1, + sizeof(asn_DEF_RICsubscriptionRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionRequest_tags_1) + /sizeof(asn_DEF_RICsubscriptionRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionRequest_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.h new file mode 100644 index 000000000..c92e05ed9 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionRequest_H_ +#define _RICsubscriptionRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionRequest */ +typedef struct RICsubscriptionRequest { + ProtocolIE_ContainerE2_1407P0_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.c b/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.c new file mode 100644 index 000000000..0ac75b23e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubscriptionResponse.h" + +asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubscriptionResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P1, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubscriptionResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubscriptionResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1 = { + sizeof(struct RICsubscriptionResponse), + offsetof(struct RICsubscriptionResponse, _asn_ctx), + asn_MAP_RICsubscriptionResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse = { + "RICsubscriptionResponse", + "RICsubscriptionResponse", + &asn_OP_SEQUENCE, + asn_DEF_RICsubscriptionResponse_tags_1, + sizeof(asn_DEF_RICsubscriptionResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */ + asn_DEF_RICsubscriptionResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubscriptionResponse_tags_1) + /sizeof(asn_DEF_RICsubscriptionResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubscriptionResponse_1, + 1, /* Elements count */ + &asn_SPC_RICsubscriptionResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.h b/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.h new file mode 100644 index 000000000..0fbcff36f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubscriptionResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubscriptionResponse_H_ +#define _RICsubscriptionResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubscriptionResponse */ +typedef struct RICsubscriptionResponse { + ProtocolIE_ContainerE2_1407P1_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubscriptionResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubscriptionResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubscriptionResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubscriptionResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubscriptionResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubsequentAction.c b/src/codec_utils/E2AP_OLD1/RICsubsequentAction.c new file mode 100644 index 000000000..e6f899506 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubsequentAction.c @@ -0,0 +1,60 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubsequentAction.h" + +asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricSubsequentActionType), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICsubsequentActionType, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricSubsequentActionType" + }, + { ATF_NOFLAGS, 0, offsetof(struct RICsubsequentAction, ricTimeToWait), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RICtimeToWait, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ricTimeToWait" + }, +}; +static const ber_tlv_tag_t asn_DEF_RICsubsequentAction_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RICsubsequentAction_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ricSubsequentActionType */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ricTimeToWait */ +}; +asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1 = { + sizeof(struct RICsubsequentAction), + offsetof(struct RICsubsequentAction, _asn_ctx), + asn_MAP_RICsubsequentAction_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 2, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction = { + "RICsubsequentAction", + "RICsubsequentAction", + &asn_OP_SEQUENCE, + asn_DEF_RICsubsequentAction_tags_1, + sizeof(asn_DEF_RICsubsequentAction_tags_1) + /sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */ + asn_DEF_RICsubsequentAction_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubsequentAction_tags_1) + /sizeof(asn_DEF_RICsubsequentAction_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_RICsubsequentAction_1, + 2, /* Elements count */ + &asn_SPC_RICsubsequentAction_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubsequentAction.h b/src/codec_utils/E2AP_OLD1/RICsubsequentAction.h new file mode 100644 index 000000000..1496df33f --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubsequentAction.h @@ -0,0 +1,46 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubsequentAction_H_ +#define _RICsubsequentAction_H_ + + +#include + +/* Including external dependencies */ +#include "RICsubsequentActionType.h" +#include "RICtimeToWait.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RICsubsequentAction */ +typedef struct RICsubsequentAction { + RICsubsequentActionType_t ricSubsequentActionType; + RICtimeToWait_t ricTimeToWait; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RICsubsequentAction_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentAction; +extern asn_SEQUENCE_specifics_t asn_SPC_RICsubsequentAction_specs_1; +extern asn_TYPE_member_t asn_MBR_RICsubsequentAction_1[2]; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubsequentAction_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.c b/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.c new file mode 100644 index 000000000..050b1b55d --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICsubsequentActionType.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICsubsequentActionType_value2enum_1[] = { + { 0, 8, "continue" }, + { 1, 4, "wait" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICsubsequentActionType_enum2value_1[] = { + 0, /* continue(0) */ + 1 /* wait(1) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1 = { + asn_MAP_RICsubsequentActionType_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICsubsequentActionType_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICsubsequentActionType_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType = { + "RICsubsequentActionType", + "RICsubsequentActionType", + &asn_OP_NativeEnumerated, + asn_DEF_RICsubsequentActionType_tags_1, + sizeof(asn_DEF_RICsubsequentActionType_tags_1) + /sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */ + asn_DEF_RICsubsequentActionType_tags_1, /* Same as above */ + sizeof(asn_DEF_RICsubsequentActionType_tags_1) + /sizeof(asn_DEF_RICsubsequentActionType_tags_1[0]), /* 1 */ + { &asn_OER_type_RICsubsequentActionType_constr_1, &asn_PER_type_RICsubsequentActionType_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICsubsequentActionType_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.h b/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.h new file mode 100644 index 000000000..c41df0acc --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICsubsequentActionType.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICsubsequentActionType_H_ +#define _RICsubsequentActionType_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICsubsequentActionType { + RICsubsequentActionType_continue = 0, + RICsubsequentActionType_wait = 1 + /* + * Enumeration is extensible + */ +} e_RICsubsequentActionType; + +/* RICsubsequentActionType */ +typedef long RICsubsequentActionType_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICsubsequentActionType_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICsubsequentActionType; +extern const asn_INTEGER_specifics_t asn_SPC_RICsubsequentActionType_specs_1; +asn_struct_free_f RICsubsequentActionType_free; +asn_struct_print_f RICsubsequentActionType_print; +asn_constr_check_f RICsubsequentActionType_constraint; +ber_type_decoder_f RICsubsequentActionType_decode_ber; +der_type_encoder_f RICsubsequentActionType_encode_der; +xer_type_decoder_f RICsubsequentActionType_decode_xer; +xer_type_encoder_f RICsubsequentActionType_encode_xer; +oer_type_decoder_f RICsubsequentActionType_decode_oer; +oer_type_encoder_f RICsubsequentActionType_encode_oer; +per_type_decoder_f RICsubsequentActionType_decode_uper; +per_type_encoder_f RICsubsequentActionType_encode_uper; +per_type_decoder_f RICsubsequentActionType_decode_aper; +per_type_encoder_f RICsubsequentActionType_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICsubsequentActionType_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/RICtimeToWait.c b/src/codec_utils/E2AP_OLD1/RICtimeToWait.c new file mode 100644 index 000000000..488974f8b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICtimeToWait.c @@ -0,0 +1,90 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "RICtimeToWait.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_RICtimeToWait_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 5, 5, 0, 17 } /* (0..17,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_RICtimeToWait_value2enum_1[] = { + { 0, 4, "zero" }, + { 1, 4, "w1ms" }, + { 2, 4, "w2ms" }, + { 3, 4, "w5ms" }, + { 4, 5, "w10ms" }, + { 5, 5, "w20ms" }, + { 6, 5, "w30ms" }, + { 7, 5, "w40ms" }, + { 8, 5, "w50ms" }, + { 9, 6, "w100ms" }, + { 10, 6, "w200ms" }, + { 11, 6, "w500ms" }, + { 12, 3, "w1s" }, + { 13, 3, "w2s" }, + { 14, 3, "w5s" }, + { 15, 4, "w10s" }, + { 16, 4, "w20s" }, + { 17, 4, "w60s" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_RICtimeToWait_enum2value_1[] = { + 9, /* w100ms(9) */ + 4, /* w10ms(4) */ + 15, /* w10s(15) */ + 1, /* w1ms(1) */ + 12, /* w1s(12) */ + 10, /* w200ms(10) */ + 5, /* w20ms(5) */ + 16, /* w20s(16) */ + 2, /* w2ms(2) */ + 13, /* w2s(13) */ + 6, /* w30ms(6) */ + 7, /* w40ms(7) */ + 11, /* w500ms(11) */ + 8, /* w50ms(8) */ + 3, /* w5ms(3) */ + 14, /* w5s(14) */ + 17, /* w60s(17) */ + 0 /* zero(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1 = { + asn_MAP_RICtimeToWait_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_RICtimeToWait_enum2value_1, /* N => "tag"; sorted by N */ + 18, /* Number of elements in the maps */ + 19, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_RICtimeToWait_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_RICtimeToWait = { + "RICtimeToWait", + "RICtimeToWait", + &asn_OP_NativeEnumerated, + asn_DEF_RICtimeToWait_tags_1, + sizeof(asn_DEF_RICtimeToWait_tags_1) + /sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */ + asn_DEF_RICtimeToWait_tags_1, /* Same as above */ + sizeof(asn_DEF_RICtimeToWait_tags_1) + /sizeof(asn_DEF_RICtimeToWait_tags_1[0]), /* 1 */ + { &asn_OER_type_RICtimeToWait_constr_1, &asn_PER_type_RICtimeToWait_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_RICtimeToWait_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/RICtimeToWait.h b/src/codec_utils/E2AP_OLD1/RICtimeToWait.h new file mode 100644 index 000000000..a4d0a71ef --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/RICtimeToWait.h @@ -0,0 +1,72 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _RICtimeToWait_H_ +#define _RICtimeToWait_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum RICtimeToWait { + RICtimeToWait_zero = 0, + RICtimeToWait_w1ms = 1, + RICtimeToWait_w2ms = 2, + RICtimeToWait_w5ms = 3, + RICtimeToWait_w10ms = 4, + RICtimeToWait_w20ms = 5, + RICtimeToWait_w30ms = 6, + RICtimeToWait_w40ms = 7, + RICtimeToWait_w50ms = 8, + RICtimeToWait_w100ms = 9, + RICtimeToWait_w200ms = 10, + RICtimeToWait_w500ms = 11, + RICtimeToWait_w1s = 12, + RICtimeToWait_w2s = 13, + RICtimeToWait_w5s = 14, + RICtimeToWait_w10s = 15, + RICtimeToWait_w20s = 16, + RICtimeToWait_w60s = 17 + /* + * Enumeration is extensible + */ +} e_RICtimeToWait; + +/* RICtimeToWait */ +typedef long RICtimeToWait_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_RICtimeToWait_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_RICtimeToWait; +extern const asn_INTEGER_specifics_t asn_SPC_RICtimeToWait_specs_1; +asn_struct_free_f RICtimeToWait_free; +asn_struct_print_f RICtimeToWait_print; +asn_constr_check_f RICtimeToWait_constraint; +ber_type_decoder_f RICtimeToWait_decode_ber; +der_type_encoder_f RICtimeToWait_encode_der; +xer_type_decoder_f RICtimeToWait_decode_xer; +xer_type_encoder_f RICtimeToWait_encode_xer; +oer_type_decoder_f RICtimeToWait_decode_oer; +oer_type_encoder_f RICtimeToWait_encode_oer; +per_type_decoder_f RICtimeToWait_decode_uper; +per_type_encoder_f RICtimeToWait_encode_uper; +per_type_decoder_f RICtimeToWait_decode_aper; +per_type_encoder_f RICtimeToWait_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _RICtimeToWait_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ResetRequest.c b/src/codec_utils/E2AP_OLD1/ResetRequest.c new file mode 100644 index 000000000..2793af7f4 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ResetRequest.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ResetRequest.h" + +asn_TYPE_member_t asn_MBR_ResetRequest_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetRequest, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P14, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetRequest_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetRequest_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1 = { + sizeof(struct ResetRequest), + offsetof(struct ResetRequest, _asn_ctx), + asn_MAP_ResetRequest_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetRequest = { + "ResetRequest", + "ResetRequest", + &asn_OP_SEQUENCE, + asn_DEF_ResetRequest_tags_1, + sizeof(asn_DEF_ResetRequest_tags_1) + /sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */ + asn_DEF_ResetRequest_tags_1, /* Same as above */ + sizeof(asn_DEF_ResetRequest_tags_1) + /sizeof(asn_DEF_ResetRequest_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetRequest_1, + 1, /* Elements count */ + &asn_SPC_ResetRequest_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ResetRequest.h b/src/codec_utils/E2AP_OLD1/ResetRequest.h new file mode 100644 index 000000000..bc7f37093 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ResetRequest.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ResetRequest_H_ +#define _ResetRequest_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ResetRequest */ +typedef struct ResetRequest { + ProtocolIE_ContainerE2_1407P14_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetRequest_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ResetRequest; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetRequest_specs_1; +extern asn_TYPE_member_t asn_MBR_ResetRequest_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ResetRequest_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/ResetResponse.c b/src/codec_utils/E2AP_OLD1/ResetResponse.c new file mode 100644 index 000000000..e92274917 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ResetResponse.c @@ -0,0 +1,50 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "ResetResponse.h" + +asn_TYPE_member_t asn_MBR_ResetResponse_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ResetResponse, protocolIEs), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProtocolIE_ContainerE2_1407P15, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "protocolIEs" + }, +}; +static const ber_tlv_tag_t asn_DEF_ResetResponse_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ResetResponse_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* protocolIEs */ +}; +asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1 = { + sizeof(struct ResetResponse), + offsetof(struct ResetResponse, _asn_ctx), + asn_MAP_ResetResponse_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + 1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_ResetResponse = { + "ResetResponse", + "ResetResponse", + &asn_OP_SEQUENCE, + asn_DEF_ResetResponse_tags_1, + sizeof(asn_DEF_ResetResponse_tags_1) + /sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */ + asn_DEF_ResetResponse_tags_1, /* Same as above */ + sizeof(asn_DEF_ResetResponse_tags_1) + /sizeof(asn_DEF_ResetResponse_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_ResetResponse_1, + 1, /* Elements count */ + &asn_SPC_ResetResponse_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/ResetResponse.h b/src/codec_utils/E2AP_OLD1/ResetResponse.h new file mode 100644 index 000000000..668029db0 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/ResetResponse.h @@ -0,0 +1,44 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Contents" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _ResetResponse_H_ +#define _ResetResponse_H_ + + +#include + +/* Including external dependencies */ +#include "ProtocolIE-ContainerE2.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ResetResponse */ +typedef struct ResetResponse { + ProtocolIE_ContainerE2_1407P15_t protocolIEs; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ResetResponse_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ResetResponse; +extern asn_SEQUENCE_specifics_t asn_SPC_ResetResponse_specs_1; +extern asn_TYPE_member_t asn_MBR_ResetResponse_1[1]; + +#ifdef __cplusplus +} +#endif + +#endif /* _ResetResponse_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.c b/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.c new file mode 100644 index 000000000..af0051874 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.c @@ -0,0 +1,368 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "SuccessfulOutcomeE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_SuccessfulOutcomeE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_SuccessfulOutcomeE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 1; /* &SuccessfulOutcomeE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct SuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICsubscriptionResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICsubscriptionDeleteResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICserviceUpdateAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateAcknowledge, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdateAcknowledge" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.RICcontrolAcknowledge), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolAcknowledge, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolAcknowledge" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.E2setupResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupResponse" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2__value, choice.ResetResponse), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_ResetResponse, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "ResetResponse" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 5 }, /* RICsubscriptionResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 4 }, /* RICsubscriptionDeleteResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 3 }, /* RICserviceUpdateAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 2 }, /* RICcontrolAcknowledge */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 1 }, /* E2setupResponse */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -5, 0 } /* ResetResponse */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct SuccessfulOutcomeE2__value), + offsetof(struct SuccessfulOutcomeE2__value, _asn_ctx), + offsetof(struct SuccessfulOutcomeE2__value, present), + sizeof(((struct SuccessfulOutcomeE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 6, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 6, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_SuccessfulOutcomeE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_SuccessfulOutcomeE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SuccessfulOutcomeE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_SuccessfulOutcomeE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_SuccessfulOutcomeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SuccessfulOutcomeE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcomeE2_specs_1 = { + sizeof(struct SuccessfulOutcomeE2), + offsetof(struct SuccessfulOutcomeE2, _asn_ctx), + asn_MAP_SuccessfulOutcomeE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcomeE2 = { + "SuccessfulOutcomeE2", + "SuccessfulOutcomeE2", + &asn_OP_SEQUENCE, + asn_DEF_SuccessfulOutcomeE2_tags_1, + sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1[0]), /* 1 */ + asn_DEF_SuccessfulOutcomeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_SuccessfulOutcomeE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_SuccessfulOutcomeE2_1, + 3, /* Elements count */ + &asn_SPC_SuccessfulOutcomeE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.h b/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.h new file mode 100644 index 000000000..4c408523c --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/SuccessfulOutcomeE2.h @@ -0,0 +1,91 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _SuccessfulOutcomeE2_H_ +#define _SuccessfulOutcomeE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum SuccessfulOutcomeE2__value_PR { + SuccessfulOutcomeE2__value_PR_NOTHING, /* No components present */ + SuccessfulOutcomeE2__value_PR_RICsubscriptionResponse, + SuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteResponse, + SuccessfulOutcomeE2__value_PR_RICserviceUpdateAcknowledge, + SuccessfulOutcomeE2__value_PR_RICcontrolAcknowledge, + SuccessfulOutcomeE2__value_PR_E2setupResponse, + SuccessfulOutcomeE2__value_PR_ResetResponse +} SuccessfulOutcomeE2__value_PR; + +/* SuccessfulOutcomeE2 */ +typedef struct SuccessfulOutcomeE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct SuccessfulOutcomeE2__value { + SuccessfulOutcomeE2__value_PR present; + union SuccessfulOutcomeE2__value_u { + RICsubscriptionResponse_t RICsubscriptionResponse; + RICsubscriptionDeleteResponse_t RICsubscriptionDeleteResponse; + RICserviceUpdateAcknowledge_t RICserviceUpdateAcknowledge; + RICcontrolAcknowledge_t RICcontrolAcknowledge; + E2setupResponse_t E2setupResponse; + ResetResponse_t ResetResponse; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SuccessfulOutcomeE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_SuccessfulOutcomeE2; +extern asn_SEQUENCE_specifics_t asn_SPC_SuccessfulOutcomeE2_specs_1; +extern asn_TYPE_member_t asn_MBR_SuccessfulOutcomeE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _SuccessfulOutcomeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/TimeToWaitE2.c b/src/codec_utils/E2AP_OLD1/TimeToWaitE2.c new file mode 100644 index 000000000..2bccde668 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TimeToWaitE2.c @@ -0,0 +1,66 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TimeToWaitE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TimeToWaitE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_TimeToWaitE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 3, 3, 0, 5 } /* (0..5,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TimeToWaitE2_value2enum_1[] = { + { 0, 3, "v1s" }, + { 1, 3, "v2s" }, + { 2, 3, "v5s" }, + { 3, 4, "v10s" }, + { 4, 4, "v20s" }, + { 5, 4, "v60s" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_TimeToWaitE2_enum2value_1[] = { + 3, /* v10s(3) */ + 0, /* v1s(0) */ + 4, /* v20s(4) */ + 1, /* v2s(1) */ + 2, /* v5s(2) */ + 5 /* v60s(5) */ + /* This list is extensible */ +}; +static const asn_INTEGER_specifics_t asn_SPC_TimeToWaitE2_specs_1 = { + asn_MAP_TimeToWaitE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TimeToWaitE2_enum2value_1, /* N => "tag"; sorted by N */ + 6, /* Number of elements in the maps */ + 7, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TimeToWaitE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TimeToWaitE2 = { + "TimeToWaitE2", + "TimeToWaitE2", + &asn_OP_NativeEnumerated, + asn_DEF_TimeToWaitE2_tags_1, + sizeof(asn_DEF_TimeToWaitE2_tags_1) + /sizeof(asn_DEF_TimeToWaitE2_tags_1[0]), /* 1 */ + asn_DEF_TimeToWaitE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TimeToWaitE2_tags_1) + /sizeof(asn_DEF_TimeToWaitE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TimeToWaitE2_constr_1, &asn_PER_type_TimeToWaitE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TimeToWaitE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/TimeToWaitE2.h b/src/codec_utils/E2AP_OLD1/TimeToWaitE2.h new file mode 100644 index 000000000..94fd8ed91 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TimeToWaitE2.h @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TimeToWaitE2_H_ +#define _TimeToWaitE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TimeToWaitE2 { + TimeToWaitE2_v1s = 0, + TimeToWaitE2_v2s = 1, + TimeToWaitE2_v5s = 2, + TimeToWaitE2_v10s = 3, + TimeToWaitE2_v20s = 4, + TimeToWaitE2_v60s = 5 + /* + * Enumeration is extensible + */ +} e_TimeToWaitE2; + +/* TimeToWaitE2 */ +typedef long TimeToWaitE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_TimeToWaitE2; +asn_struct_free_f TimeToWaitE2_free; +asn_struct_print_f TimeToWaitE2_print; +asn_constr_check_f TimeToWaitE2_constraint; +ber_type_decoder_f TimeToWaitE2_decode_ber; +der_type_encoder_f TimeToWaitE2_encode_der; +xer_type_decoder_f TimeToWaitE2_decode_xer; +xer_type_encoder_f TimeToWaitE2_encode_xer; +oer_type_decoder_f TimeToWaitE2_decode_oer; +oer_type_encoder_f TimeToWaitE2_encode_oer; +per_type_decoder_f TimeToWaitE2_decode_uper; +per_type_encoder_f TimeToWaitE2_encode_uper; +per_type_decoder_f TimeToWaitE2_decode_aper; +per_type_encoder_f TimeToWaitE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TimeToWaitE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.c b/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.c new file mode 100644 index 000000000..38485887e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TriggeringMessageE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TriggeringMessageE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_TriggeringMessageE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TriggeringMessageE2_value2enum_1[] = { + { 0, 18, "initiating-message" }, + { 1, 18, "successful-outcome" }, + { 2, 21, "unsuccessfull-outcome" } +}; +static const unsigned int asn_MAP_TriggeringMessageE2_enum2value_1[] = { + 0, /* initiating-message(0) */ + 1, /* successful-outcome(1) */ + 2 /* unsuccessfull-outcome(2) */ +}; +const asn_INTEGER_specifics_t asn_SPC_TriggeringMessageE2_specs_1 = { + asn_MAP_TriggeringMessageE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TriggeringMessageE2_enum2value_1, /* N => "tag"; sorted by N */ + 3, /* Number of elements in the maps */ + 0, /* Enumeration is not extensible */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TriggeringMessageE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TriggeringMessageE2 = { + "TriggeringMessageE2", + "TriggeringMessageE2", + &asn_OP_NativeEnumerated, + asn_DEF_TriggeringMessageE2_tags_1, + sizeof(asn_DEF_TriggeringMessageE2_tags_1) + /sizeof(asn_DEF_TriggeringMessageE2_tags_1[0]), /* 1 */ + asn_DEF_TriggeringMessageE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TriggeringMessageE2_tags_1) + /sizeof(asn_DEF_TriggeringMessageE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TriggeringMessageE2_constr_1, &asn_PER_type_TriggeringMessageE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TriggeringMessageE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.h b/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.h new file mode 100644 index 000000000..f480dee65 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TriggeringMessageE2.h @@ -0,0 +1,54 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-CommonDataTypes" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TriggeringMessageE2_H_ +#define _TriggeringMessageE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TriggeringMessageE2 { + TriggeringMessageE2_initiating_message = 0, + TriggeringMessageE2_successful_outcome = 1, + TriggeringMessageE2_unsuccessfull_outcome = 2 +} e_TriggeringMessageE2; + +/* TriggeringMessageE2 */ +typedef long TriggeringMessageE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TriggeringMessageE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TriggeringMessageE2; +extern const asn_INTEGER_specifics_t asn_SPC_TriggeringMessageE2_specs_1; +asn_struct_free_f TriggeringMessageE2_free; +asn_struct_print_f TriggeringMessageE2_print; +asn_constr_check_f TriggeringMessageE2_constraint; +ber_type_decoder_f TriggeringMessageE2_decode_ber; +der_type_encoder_f TriggeringMessageE2_encode_der; +xer_type_decoder_f TriggeringMessageE2_decode_xer; +xer_type_encoder_f TriggeringMessageE2_encode_xer; +oer_type_decoder_f TriggeringMessageE2_decode_oer; +oer_type_encoder_f TriggeringMessageE2_encode_oer; +per_type_decoder_f TriggeringMessageE2_decode_uper; +per_type_encoder_f TriggeringMessageE2_encode_uper; +per_type_decoder_f TriggeringMessageE2_decode_aper; +per_type_encoder_f TriggeringMessageE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TriggeringMessageE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.c b/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.c new file mode 100644 index 000000000..d1d30e909 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "TypeOfErrorE2.h" + +/* + * This type is implemented using NativeEnumerated, + * so here we adjust the DEF accordingly. + */ +static asn_oer_constraints_t asn_OER_type_TypeOfErrorE2_constr_1 CC_NOTUSED = { + { 0, 0 }, + -1}; +asn_per_constraints_t asn_PER_type_TypeOfErrorE2_constr_1 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static const asn_INTEGER_enum_map_t asn_MAP_TypeOfErrorE2_value2enum_1[] = { + { 0, 14, "not-understood" }, + { 1, 7, "missing" } + /* This list is extensible */ +}; +static const unsigned int asn_MAP_TypeOfErrorE2_enum2value_1[] = { + 1, /* missing(1) */ + 0 /* not-understood(0) */ + /* This list is extensible */ +}; +const asn_INTEGER_specifics_t asn_SPC_TypeOfErrorE2_specs_1 = { + asn_MAP_TypeOfErrorE2_value2enum_1, /* "tag" => N; sorted by tag */ + asn_MAP_TypeOfErrorE2_enum2value_1, /* N => "tag"; sorted by N */ + 2, /* Number of elements in the maps */ + 3, /* Extensions before this member */ + 1, /* Strict enumeration */ + 0, /* Native long size */ + 0 +}; +static const ber_tlv_tag_t asn_DEF_TypeOfErrorE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_TypeOfErrorE2 = { + "TypeOfErrorE2", + "TypeOfErrorE2", + &asn_OP_NativeEnumerated, + asn_DEF_TypeOfErrorE2_tags_1, + sizeof(asn_DEF_TypeOfErrorE2_tags_1) + /sizeof(asn_DEF_TypeOfErrorE2_tags_1[0]), /* 1 */ + asn_DEF_TypeOfErrorE2_tags_1, /* Same as above */ + sizeof(asn_DEF_TypeOfErrorE2_tags_1) + /sizeof(asn_DEF_TypeOfErrorE2_tags_1[0]), /* 1 */ + { &asn_OER_type_TypeOfErrorE2_constr_1, &asn_PER_type_TypeOfErrorE2_constr_1, NativeEnumerated_constraint }, + 0, 0, /* Defined elsewhere */ + &asn_SPC_TypeOfErrorE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.h b/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.h new file mode 100644 index 000000000..57508d5ea --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/TypeOfErrorE2.h @@ -0,0 +1,56 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-IEs" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _TypeOfErrorE2_H_ +#define _TypeOfErrorE2_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum TypeOfErrorE2 { + TypeOfErrorE2_not_understood = 0, + TypeOfErrorE2_missing = 1 + /* + * Enumeration is extensible + */ +} e_TypeOfErrorE2; + +/* TypeOfErrorE2 */ +typedef long TypeOfErrorE2_t; + +/* Implementation */ +extern asn_per_constraints_t asn_PER_type_TypeOfErrorE2_constr_1; +extern asn_TYPE_descriptor_t asn_DEF_TypeOfErrorE2; +extern const asn_INTEGER_specifics_t asn_SPC_TypeOfErrorE2_specs_1; +asn_struct_free_f TypeOfErrorE2_free; +asn_struct_print_f TypeOfErrorE2_print; +asn_constr_check_f TypeOfErrorE2_constraint; +ber_type_decoder_f TypeOfErrorE2_decode_ber; +der_type_encoder_f TypeOfErrorE2_encode_der; +xer_type_decoder_f TypeOfErrorE2_decode_xer; +xer_type_encoder_f TypeOfErrorE2_encode_xer; +oer_type_decoder_f TypeOfErrorE2_decode_oer; +oer_type_encoder_f TypeOfErrorE2_encode_oer; +per_type_decoder_f TypeOfErrorE2_decode_uper; +per_type_encoder_f TypeOfErrorE2_encode_uper; +per_type_decoder_f TypeOfErrorE2_decode_aper; +per_type_encoder_f TypeOfErrorE2_encode_aper; + +#ifdef __cplusplus +} +#endif + +#endif /* _TypeOfErrorE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.c b/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.c new file mode 100644 index 000000000..a394f12c1 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.c @@ -0,0 +1,358 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#include "UnsuccessfulOutcomeE2.h" + +static const long asn_VAL_1_id_RICsubscription = 8; +static const long asn_VAL_1_reject = 0; +static const long asn_VAL_2_id_RICsubscriptionDelete = 9; +static const long asn_VAL_2_reject = 0; +static const long asn_VAL_3_id_RICserviceUpdate = 7; +static const long asn_VAL_3_reject = 0; +static const long asn_VAL_4_id_RICcontrol = 4; +static const long asn_VAL_4_reject = 0; +static const long asn_VAL_5_id_E2setup = 1; +static const long asn_VAL_5_reject = 0; +static const long asn_VAL_6_id_Reset = 3; +static const long asn_VAL_6_reject = 0; +static const long asn_VAL_7_id_RICindication = 5; +static const long asn_VAL_7_ignore = 1; +static const long asn_VAL_8_id_RICserviceQuery = 6; +static const long asn_VAL_8_ignore = 1; +static const long asn_VAL_9_id_ErrorIndicationE2 = 2; +static const long asn_VAL_9_ignore = 1; +static const asn_ioc_cell_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows[] = { + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_1_id_RICsubscription }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_1_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICsubscriptionDeleteRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICsubscriptionDeleteFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_2_id_RICsubscriptionDelete }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_2_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceUpdate }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICserviceUpdateFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_3_id_RICserviceUpdate }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_3_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICcontrolRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolAcknowledge }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_RICcontrolFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_4_id_RICcontrol }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_4_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_E2setupRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupResponse }, + { "&UnsuccessfulOutcomeE2", aioc__type, &asn_DEF_E2setupFailure }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_5_id_E2setup }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_5_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ResetRequest }, + { "&SuccessfulOutcomeE2", aioc__type, &asn_DEF_ResetResponse }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_6_id_Reset }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_6_reject }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICindication }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_7_id_RICindication }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_7_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_RICserviceQuery }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_8_id_RICserviceQuery }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_8_ignore }, + { "&InitiatingMessageE2", aioc__type, &asn_DEF_ErrorIndicationE2 }, + { "&SuccessfulOutcomeE2", }, + { "&UnsuccessfulOutcomeE2", }, + { "&procedureCode", aioc__value, &asn_DEF_ProcedureCodeE2, &asn_VAL_9_id_ErrorIndicationE2 }, + { "&criticality", aioc__value, &asn_DEF_CriticalityE2, &asn_VAL_9_ignore } +}; +static const asn_ioc_set_t asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1[] = { + { 9, 5, asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1_rows } +}; +static int +memb_procedureCode_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 0 && value <= 255)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_type_selector_result_t +select_UnsuccessfulOutcomeE2_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 4; /* &criticality */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_type_selector_result_t +select_UnsuccessfulOutcomeE2_value_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) { + asn_type_selector_result_t result = {0, 0}; + const asn_ioc_set_t *itable = asn_IOS_E2AP_ELEMENTARY_PROCEDURES_1; + size_t constraining_column = 3; /* &procedureCode */ + size_t for_column = 2; /* &UnsuccessfulOutcomeE2 */ + size_t row, presence_index = 0; + const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct UnsuccessfulOutcomeE2, procedureCode)); + + for(row=0; row < itable->rows_count; row++) { + const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column]; + const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column]; + + if(type_cell->cell_kind == aioc__undefined) + continue; + + presence_index++; + if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) { + result.type_descriptor = type_cell->type_descriptor; + result.presence_index = presence_index; + break; + } + } + + return result; +} + +static int +memb_value_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + if(1 /* No applicable constraints whatsoever */) { + /* Nothing is here. See below */ + } + + return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key); +} + +static asn_oer_constraints_t asn_OER_memb_procedureCode_constr_2 CC_NOTUSED = { + { 1, 1 } /* (0..255) */, + -1}; +static asn_per_constraints_t asn_PER_memb_procedureCode_constr_2 CC_NOTUSED = { + { APC_CONSTRAINED, 8, 8, 0, 255 } /* (0..255) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_criticality_constr_3 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = { + { APC_CONSTRAINED, 2, 2, 0, 2 } /* (0..2) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_memb_value_constr_4 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_memb_value_constr_4 CC_NOTUSED = { + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_TYPE_member_t asn_MBR_value_4[] = { + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICsubscriptionFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICsubscriptionDeleteFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICsubscriptionDeleteFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICsubscriptionDeleteFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICserviceUpdateFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICserviceUpdateFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICserviceUpdateFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.RICcontrolFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_RICcontrolFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "RICcontrolFailure" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2__value, choice.E2setupFailure), + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), + 0, + &asn_DEF_E2setupFailure, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "E2setupFailure" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_value_tag2el_4[] = { + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 4 }, /* RICsubscriptionFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 3 }, /* RICsubscriptionDeleteFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 2 }, /* RICserviceUpdateFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 1 }, /* RICcontrolFailure */ + { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -4, 0 } /* E2setupFailure */ +}; +static asn_CHOICE_specifics_t asn_SPC_value_specs_4 = { + sizeof(struct UnsuccessfulOutcomeE2__value), + offsetof(struct UnsuccessfulOutcomeE2__value, _asn_ctx), + offsetof(struct UnsuccessfulOutcomeE2__value, present), + sizeof(((struct UnsuccessfulOutcomeE2__value *)0)->present), + asn_MAP_value_tag2el_4, + 5, /* Count of tags in the map */ + 0, 0, + -1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_value_4 = { + "value", + "value", + &asn_OP_OPEN_TYPE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { 0, 0, OPEN_TYPE_constraint }, + asn_MBR_value_4, + 5, /* Elements count */ + &asn_SPC_value_specs_4 /* Additional specs */ +}; + +asn_TYPE_member_t asn_MBR_UnsuccessfulOutcomeE2_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, procedureCode), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ProcedureCodeE2, + 0, + { &asn_OER_memb_procedureCode_constr_2, &asn_PER_memb_procedureCode_constr_2, memb_procedureCode_constraint_1 }, + 0, 0, /* No default value */ + "procedureCode" + }, + { ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, criticality), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CriticalityE2, + select_UnsuccessfulOutcomeE2_criticality_type, + { &asn_OER_memb_criticality_constr_3, &asn_PER_memb_criticality_constr_3, memb_criticality_constraint_1 }, + 0, 0, /* No default value */ + "criticality" + }, + { ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UnsuccessfulOutcomeE2, value), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_value_4, + select_UnsuccessfulOutcomeE2_value_type, + { &asn_OER_memb_value_constr_4, &asn_PER_memb_value_constr_4, memb_value_constraint_1 }, + 0, 0, /* No default value */ + "value" + }, +}; +static const ber_tlv_tag_t asn_DEF_UnsuccessfulOutcomeE2_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_UnsuccessfulOutcomeE2_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */ +}; +asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcomeE2_specs_1 = { + sizeof(struct UnsuccessfulOutcomeE2), + offsetof(struct UnsuccessfulOutcomeE2, _asn_ctx), + asn_MAP_UnsuccessfulOutcomeE2_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* First extension addition */ +}; +asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcomeE2 = { + "UnsuccessfulOutcomeE2", + "UnsuccessfulOutcomeE2", + &asn_OP_SEQUENCE, + asn_DEF_UnsuccessfulOutcomeE2_tags_1, + sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1[0]), /* 1 */ + asn_DEF_UnsuccessfulOutcomeE2_tags_1, /* Same as above */ + sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1) + /sizeof(asn_DEF_UnsuccessfulOutcomeE2_tags_1[0]), /* 1 */ + { 0, 0, SEQUENCE_constraint }, + asn_MBR_UnsuccessfulOutcomeE2_1, + 3, /* Elements count */ + &asn_SPC_UnsuccessfulOutcomeE2_specs_1 /* Additional specs */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.h b/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.h new file mode 100644 index 000000000..b437ded74 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/UnsuccessfulOutcomeE2.h @@ -0,0 +1,89 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + * From ASN.1 module "E2AP-PDU-Descriptions" + * found in "E2AP.asn1" + * `asn1c -D ./out -fcompound-names -fno-include-deps -findirect-choice -gen-PER -no-gen-example` + */ + +#ifndef _UnsuccessfulOutcomeE2_H_ +#define _UnsuccessfulOutcomeE2_H_ + + +#include + +/* Including external dependencies */ +#include "ProcedureCodeE2.h" +#include "CriticalityE2.h" +#include +#include +#include "RICsubscriptionRequest.h" +#include "RICsubscriptionResponse.h" +#include "RICsubscriptionFailure.h" +#include "RICsubscriptionDeleteRequest.h" +#include "RICsubscriptionDeleteResponse.h" +#include "RICsubscriptionDeleteFailure.h" +#include "RICserviceUpdate.h" +#include "RICserviceUpdateAcknowledge.h" +#include "RICserviceUpdateFailure.h" +#include "RICcontrolRequest.h" +#include "RICcontrolAcknowledge.h" +#include "RICcontrolFailure.h" +#include "E2setupRequest.h" +#include "E2setupResponse.h" +#include "E2setupFailure.h" +#include "ResetRequest.h" +#include "ResetResponse.h" +#include "RICindication.h" +#include "RICserviceQuery.h" +#include "ErrorIndicationE2.h" +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum UnsuccessfulOutcomeE2__value_PR { + UnsuccessfulOutcomeE2__value_PR_NOTHING, /* No components present */ + UnsuccessfulOutcomeE2__value_PR_RICsubscriptionFailure, + UnsuccessfulOutcomeE2__value_PR_RICsubscriptionDeleteFailure, + UnsuccessfulOutcomeE2__value_PR_RICserviceUpdateFailure, + UnsuccessfulOutcomeE2__value_PR_RICcontrolFailure, + UnsuccessfulOutcomeE2__value_PR_E2setupFailure +} UnsuccessfulOutcomeE2__value_PR; + +/* UnsuccessfulOutcomeE2 */ +typedef struct UnsuccessfulOutcomeE2 { + ProcedureCodeE2_t procedureCode; + CriticalityE2_t criticality; + struct UnsuccessfulOutcomeE2__value { + UnsuccessfulOutcomeE2__value_PR present; + union UnsuccessfulOutcomeE2__value_u { + RICsubscriptionFailure_t RICsubscriptionFailure; + RICsubscriptionDeleteFailure_t RICsubscriptionDeleteFailure; + RICserviceUpdateFailure_t RICserviceUpdateFailure; + RICcontrolFailure_t RICcontrolFailure; + E2setupFailure_t E2setupFailure; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } value; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} UnsuccessfulOutcomeE2_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_UnsuccessfulOutcomeE2; +extern asn_SEQUENCE_specifics_t asn_SPC_UnsuccessfulOutcomeE2_specs_1; +extern asn_TYPE_member_t asn_MBR_UnsuccessfulOutcomeE2_1[3]; + +#ifdef __cplusplus +} +#endif + +#endif /* _UnsuccessfulOutcomeE2_H_ */ +#include diff --git a/src/codec_utils/E2AP_OLD1/asn_constant.h b/src/codec_utils/E2AP_OLD1/asn_constant.h new file mode 100644 index 000000000..a6f348cc3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/asn_constant.h @@ -0,0 +1,22 @@ +/* + * Generated by asn1c-0.9.29 (http://lionet.info/asn1c) + */ + +#ifndef _ASN_CONSTANT_H +#define _ASN_CONSTANT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define maxProtocolIEs (65535) +#define maxnoofErrors (256) +#define maxofRANfunctionID (256) +#define maxofRICactionID (16) + + +#ifdef __cplusplus +} +#endif + +#endif /* _ASN_CONSTANT_H */ diff --git a/src/codec_utils/E2AP_OLD1/constr_CHOICE.c b/src/codec_utils/E2AP_OLD1/constr_CHOICE.c new file mode 100644 index 000000000..86dcbb030 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_CHOICE.c @@ -0,0 +1,1533 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static unsigned _fetch_present_idx(const void *struct_ptr, unsigned off, + unsigned size); +static void _set_present_idx(void *sptr, unsigned offset, unsigned size, + unsigned pres); +static const void *_get_member_ptr(const asn_TYPE_descriptor_t *, + const void *sptr, asn_TYPE_member_t **elm, + unsigned *present); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +asn_dec_rval_t +CHOICE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || td->tags_count) { + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, -1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn_TYPE_member_t *elm;/* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, LEFT, elm->tag_mode); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || td->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + td->name); + RETURN(RC_FAIL); + } + + /* UNREACHABLE */ + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +asn_enc_rval_t +CHOICE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval = {0,0,0}; + const void *memb_ptr; + size_t computed_size = 0; + unsigned present; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + ASN__ENCODE_FAILED; + } + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + if(elm->optional) { + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || td->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, + cb, app_key); + if(ret == -1) + ASN__ENCODE_FAILED; + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 && present <= td->elements_count) { + const asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); + } else { + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); + } + + return asn_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return (ber_tlv_tag_t)-1; + } +} + +int +CHOICE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + return 0; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + return elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: no CHOICE element given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +CHOICE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value of a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag. + * Phase 4: Skipping unknown extensions. + * Phase 5: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 4;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + unsigned old_present; + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Start/Continue decoding the inner member */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); + old_present = _fetch_present_idx(st, + specs->pres_offset, specs->pres_size); + assert(old_present == 0 || old_present == edx + 1); + /* Record what we've got */ + _set_present_idx(st, + specs->pres_offset, specs->pres_size, edx + 1); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 3; + /* Fall through */ + } + + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); + + /* Skip the extensions section */ + if(ctx->phase == 4) { + ASN_DEBUG("skip_unknown(%d, %ld)", + tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 5; + RETURN(RC_FAIL); + case 1: + ctx->phase = 3; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); + continue; + case 2: + ctx->phase = 3; + break; + } + } + + switch(tcv) { + case XCT_BOTH: + break; /* No CHOICE? */ + case XCT_CLOSING: + if(ctx->phase != 3) + break; + XER_ADVANCE(ch_size); + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which inner member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr,ch_size,elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx != td->elements_count) + continue; + + /* It is expected extension */ + if(specs->ext_start != -1) { + ASN_DEBUG("Got anticipated extension"); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + ctx->phase = 3; /* Terminating */ + } else { + ctx->left = 1; + ctx->phase = 4; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); + break; + } + + ctx->phase = 5; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + +asn_enc_rval_t +CHOICE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + unsigned present = 0; + + if(!sptr) + ASN__ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present == 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr = NULL; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_dec_rval_t +CHOICE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) { + ASN_DEBUG("CHOICE presence from wire %d", value); + value = specs->from_canonical_order[value]; + ASN_DEBUG("CHOICE presence index effective %d", value); + } + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present == 0 || present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + if(ct && ct->range_bits >= 0) { + if(present_enc < ct->lower_bound + || present_enc > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG( + "CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + if(per_put_few_bits(po, 0, 1)) + ASN__ENCODE_FAILED; + } + + + elm = &td->elements[present]; + ASN_DEBUG("CHOICE member \"%s\" %d (as %d)", elm->name, present, + present_enc); + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) ASN__ENCODE_FAILED; + if(uper_put_nsnnwn(po, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +asn_dec_rval_t +CHOICE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + const asn_per_constraint_t *ct; + const asn_per_constraint_t *ext_ct = NULL; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) { + ext_ct = ct; + ct = 0; /* Not restricted */ + } + } + + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = aper_get_nsnnwn(pd, ext_ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if((unsigned)value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->from_canonical_order) + value = specs->from_canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } else { + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm; /* CHOICE's element */ + const asn_per_constraint_t *ct = NULL; + const asn_per_constraint_t *ext_ct = NULL; + const void *memb_ptr; + unsigned present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE using ALIGNED PER", td->name); + + if(constraints) ct = &constraints->value; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->value; + else ct = NULL; + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || (unsigned)present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + /* Adjust if canonical order is different from natural order */ + if(specs->to_canonical_order) + present_enc = specs->to_canonical_order[present]; + else + present_enc = present; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + if(ct && (ct->range_bits >= 0)) { + // Value is not within the range of the primary values ? + if(present < ct->lower_bound || present > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + ASN_DEBUG("CHOICE member %d (enc %d) is an extension (%ld..%ld)", + present, present_enc, ct->lower_bound, ct->upper_bound); + // X691/23.5 Extension marker = 1 + if(per_put_few_bits(po, 1, 1)) { + ASN__ENCODE_FAILED; + } + } else { + ASN__ENCODE_FAILED; + } + // no more need of constraint. + ext_ct = ct; + ct = NULL; + } + } + + if(ct && (ct->flags & APC_EXTENSIBLE)) { + ASN_DEBUG("CHOICE member %d (enc %d) is not an extension (%ld..%ld)", + present, present, ct->lower_bound, ct->upper_bound); + // X691.23.5 Extension marker = 0 + if(per_put_few_bits(po, 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (const char *)sptr + elm->memb_offset; + } + + if(ct && (ct->range_bits >= 0)) { + // By construction (ct != 0), the alternative value is a non extended one. + // X691/23.7 X691/23.6 alternative value encoded as a range_bits bits value. + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po); + } else { + asn_enc_rval_t rval = {0,0,0}; + if(specs->ext_start == -1) + ASN__ENCODE_FAILED; + // X691/23.8 normally encoded as a small non negative whole number + + if(ext_ct && aper_put_nsnnwn(po, ext_ct->range_bits, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(aper_open_type_put(elm->type, elm->encoding_constraints.per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + +int +CHOICE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Print that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + } + + return elm->type->op->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +CHOICE_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static unsigned +_fetch_present_idx(const void *struct_ptr, unsigned pres_offset, + unsigned pres_size) { + const void *present_ptr; + unsigned present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const unsigned int *)present_ptr; break; + case sizeof(short): present = *(const unsigned short *)present_ptr; break; + case sizeof(char): present = *(const unsigned char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static void +_set_present_idx(void *struct_ptr, unsigned pres_offset, unsigned pres_size, + unsigned present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(unsigned int *)present_ptr = present; break; + case sizeof(short): *(unsigned short *)present_ptr = present; break; + case sizeof(char): *(unsigned char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} + +static const void * +_get_member_ptr(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_TYPE_member_t **elm_ptr, unsigned *present_out) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned present; + + if(!sptr) { + *elm_ptr = NULL; + *present_out = 0; + return NULL; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + *present_out = present; + + /* + * The presence index is intentionally 1-based to avoid + * treating zeroed structure as a valid one. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *const elm = &td->elements[present - 1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + *elm_ptr = elm; + return memb_ptr; + } else { + *elm_ptr = NULL; + return NULL; + } + +} + +int +CHOICE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, const void *bptr) { + asn_TYPE_member_t *aelm; + asn_TYPE_member_t *belm; + unsigned apresent = 0; + unsigned bpresent = 0; + const void *amember = _get_member_ptr(td, aptr, &aelm, &apresent); + const void *bmember = _get_member_ptr(td, bptr, &belm, &bpresent); + + if(amember && bmember) { + if(apresent == bpresent) { + assert(aelm == belm); + return aelm->type->op->compare_struct(aelm->type, amember, bmember); + } else if(apresent < bpresent) { + return -1; + } else { + return 1; + } + } else if(!amember) { + return -1; + } else { + return 1; + } +} + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned +CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, const void *sptr) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + return _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); +} + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int +CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, void *sptr, + unsigned present) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + unsigned old_present; + + if(!sptr) { + return -1; + } + + if(present > td->elements_count) + return -1; + + old_present = + _fetch_present_idx(sptr, specs->pres_offset, specs->pres_size); + if(present == old_present) + return 0; + + if(old_present != 0) { + assert(old_present <= td->elements_count); + ASN_STRUCT_RESET(*td, sptr); + } + + _set_present_idx(sptr, specs->pres_offset, specs->pres_size, present); + + return 0; +} + + +asn_random_fill_result_t +CHOICE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_random_fill_result_t res; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm; + unsigned present; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + void *st = *sptr; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + present = asn_random_between(1, td->elements_count); + elm = &td->elements[present - 1]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + res = elm->type->op->random_fill(elm->type, memb_ptr2, + &elm->encoding_constraints, max_length); + _set_present_idx(st, specs->pres_offset, specs->pres_size, present); + if(res.code == ARFILL_OK) { + *sptr = st; + } else { + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + } + + return res; +} + + +asn_TYPE_operation_t asn_OP_CHOICE = { + CHOICE_free, + CHOICE_print, + CHOICE_compare, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + CHOICE_decode_oer, + CHOICE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + CHOICE_decode_uper, + CHOICE_encode_uper, + CHOICE_decode_aper, + CHOICE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + CHOICE_random_fill, + CHOICE_outmost_tag +}; diff --git a/src/codec_utils/E2AP_OLD1/constr_CHOICE.h b/src/codec_utils/E2AP_OLD1/constr_CHOICE.h new file mode 100644 index 000000000..a1999edc4 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_CHOICE.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_CHOICE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_codec_ctx_t member */ + unsigned pres_offset; /* Identifier of the present member */ + unsigned pres_size; /* Size of the identifier (enum) */ + + /* + * Tags to members mapping table. + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* Canonical ordering of CHOICE elements, for PER */ + const unsigned *to_canonical_order; + const unsigned *from_canonical_order; + + /* + * Extensions-related stuff. + */ + signed ext_start; /* First member of extensions, or -1 */ +} asn_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; +asn_struct_compare_f CHOICE_compare; +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; +xer_type_encoder_f CHOICE_encode_xer; +oer_type_decoder_f CHOICE_decode_oer; +oer_type_encoder_f CHOICE_encode_oer; +per_type_decoder_f CHOICE_decode_uper; +per_type_encoder_f CHOICE_encode_uper; +per_type_decoder_f CHOICE_decode_aper; +per_type_encoder_f CHOICE_encode_aper; +asn_outmost_tag_f CHOICE_outmost_tag; +asn_random_fill_f CHOICE_random_fill; +extern asn_TYPE_operation_t asn_OP_CHOICE; + +/* + * Return the 1-based choice variant presence index. + * Returns 0 in case of error. + */ +unsigned CHOICE_variant_get_presence(const asn_TYPE_descriptor_t *td, + const void *structure_ptr); + +/* + * Sets or resets the 1-based choice variant presence index. + * In case a previous index is not zero, the currently selected structure + * member is freed and zeroed-out first. + * Returns 0 on success and -1 on error. + */ +int CHOICE_variant_set_presence(const asn_TYPE_descriptor_t *td, + void *structure_ptr, unsigned present); + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/constr_CHOICE_oer.c b/src/codec_utils/E2AP_OLD1/constr_CHOICE_oer.c new file mode 100644 index 000000000..a4c591c8e --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_CHOICE_oer.c @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val & 0x3F) != 0x3F) { + /* #8.7.1 */ + *tag_r = ((val & 0x3F) << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + +asn_dec_rval_t +CHOICE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + (void)constraints; + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + switch(ctx->phase) { + case 0: { + /* + * Discover the tag. + */ + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + + tag_len = oer_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case 0: + ASN__DECODE_STARVED; + case -1: + ASN__DECODE_FAILED; + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + + t2m = (const asn_TYPE_tag2member_t *)bsearch( + &key, specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG( + "Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip open type extension */ + ASN_DEBUG( + "Not implemented skipping open type extension for tag %s", + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + } while(0); + + + ADVANCE(tag_len); + } + /* Fall through */ + case 1: { + asn_TYPE_member_t *elm = &elements[ctx->step]; /* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_dec_rval_t rval = {0,0}; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Set presence to be able to free it properly at any time */ + (void)CHOICE_variant_set_presence(td, st, ctx->step + 1); + + if(specs->ext_start >= 0 && specs->ext_start <= ctx->step) { + ssize_t got = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + if(got < 0) ASN__DECODE_FAILED; + if(got == 0) ASN__DECODE_STARVED; + rval.code = RC_OK; + rval.consumed = got; + } else { + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + rval.consumed += consumed_myself; + switch(rval.code) { + case RC_OK: + NEXT_PHASE(ctx); + case RC_WMORE: + break; + case RC_FAIL: + SET_PHASE(ctx, 3); /* => 3 */ + } + return rval; + } + case 2: + /* Already decoded everything */ + RETURN(RC_OK); + case 3: + /* Failed to decode, after all */ + RETURN(RC_FAIL); + } + + RETURN(RC_FAIL); +} + +/* + * X.696 (08/2015) #8.7 Encoding of tags + */ +static ssize_t +oer_put_tag(ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + + if(tval < 0x3F) { + uint8_t b = (uint8_t)((tclass << 6) | tval); + if(cb(&b, 1, app_key) < 0) { + return -1; + } + return 1; + } else { + uint8_t buf[1 + 2 * sizeof(tval)]; + uint8_t *b = &buf[sizeof(buf)-1]; /* Last addressable */ + size_t encoded; + for(; ; tval >>= 7) { + if(tval >> 7) { + *b-- = 0x80 | (tval & 0x7f); + } else { + *b-- = tval & 0x7f; + break; + } + } + *b = (uint8_t)((tclass << 6) | 0x3F); + encoded = sizeof(buf) - (b - buf); + if(cb(b, encoded, app_key) < 0) { + return -1; + } + return encoded; + } + +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +CHOICE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_CHOICE_specifics_t *specs = + (const asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + unsigned present; + const void *memb_ptr; + ber_tlv_tag_t tag; + ssize_t tag_len; + asn_enc_rval_t er = {0, 0, 0}; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("OER %s encoding as CHOICE", td->name); + + present = CHOICE_variant_get_presence(td, sptr); + if(present == 0 || present > td->elements_count) { + ASN_DEBUG("CHOICE %s member is not selected", td->name); + ASN__ENCODE_FAILED; + } + + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + tag = asn_TYPE_outmost_tag(elm->type, memb_ptr, elm->tag_mode, elm->tag); + if(tag == 0) { + ASN__ENCODE_FAILED; + } + + tag_len = oer_put_tag(tag, cb, app_key); + if(tag_len < 0) { + ASN__ENCODE_FAILED; + } + + if(specs->ext_start >= 0 && (unsigned)specs->ext_start <= (present-1)) { + ssize_t encoded = oer_open_type_put(elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(encoded < 0) ASN__ENCODE_FAILED; + er.encoded = tag_len + encoded; + } else { + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded >= 0) er.encoded += tag_len; + } + + return er; +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.c b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.c new file mode 100644 index 000000000..43dcac70b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.c @@ -0,0 +1,2059 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) { + if(a->el_no > b->el_no) + return 1; + /* + * Important: we do not check + * for a->el_no <= b->el_no! + */ + return 0; + } else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + const asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = ((size_t)ctx->step >> 1); edx < td->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + size_t opt_edx_end; /* Next non-optional element */ + size_t n; + int use_bsearch; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%" ASN_PRI_SIZE " flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx))) { + ASN_DEBUG("End of SEQUENCE %s", td->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("Current tag in %s SEQUENCE for element %" ASN_PRI_SIZE " " + "(%s) is %s encoded in %d bytes, of frame %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } else if(((const uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %" ASN_PRI_SIZE ", opt = %d, ec=%d", edx, + elements[edx].optional, td->elements_count); + if((edx + elements[edx].optional == td->elements_count) + || IN_EXTENSION_GROUP(specs, edx)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + + /* + * Find the next available type with this tag. + */ + use_bsearch = 0; + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ + else if(opt_edx_end - edx > 8) { + /* Limit the scope of linear search... */ + opt_edx_end = edx + 8; + use_bsearch = 1; + /* ... and resort to bsearch() */ + } + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].flags & ATF_ANY_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; + break; + } + } + if(use_bsearch) { + /* + * Resort to a binary search over + * sorted array of tags. + */ + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key = {0, 0, 0, 0}; + key.el_tag = tlv_tag; + key.el_no = edx; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + const asn_TYPE_tag2member_t *best = 0; + const asn_TYPE_tag2member_t *t2m_f, *t2m_l; + size_t edx_max = edx + elements[edx].optional; + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + } + n = opt_edx_end; + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + if(!IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Unexpected tag %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + ASN_DEBUG("Expected tag %s (%s)%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + edx += elements[edx].optional; + + ASN_DEBUG("Skipping unexpected %s (at %" ASN_PRI_SIZE ")", + ber_tlv_tag_string(tlv_tag), edx); + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, td->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + if(elements[edx].flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_ber_get(opt_codec_ctx, td, st, &elements[edx], ptr, LEFT); + } else { + rval = elements[edx].type->op->ber_decoder(opt_codec_ctx, + elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + } + ASN_DEBUG("In %s SEQUENCE decoded %" ASN_PRI_SIZE " %s of %d " + "in %d bytes rval.code %d, size=%d", + td->name, edx, elements[edx].type->name, + (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + /* Fall through */ + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + td->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, td->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + td->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + + +/* + * The DER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t computed_size = 0; + asn_enc_rval_t erval = {0,0,0}; + ssize_t ret; + size_t edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + erval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) + ASN__ENCODE_FAILED; + erval.encoded = computed_size + ret; + + if(!cb) ASN__ENCODED_OK(erval); + + /* + * Encode all members. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval = {0,0,0}; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) continue; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + tmperval = elm->type->op->der_encoder(elm->type, *memb_ptr2, + elm->tag_mode, elm->tag, cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %" ASN_PRI_SIZE " %s of SEQUENCE %s encoded in %ld bytes", + edx, elm->name, td->name, (long)tmperval.encoded); + } + + if(computed_size != 0) + /* + * Encoded size is not equal to the computed size. + */ + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(erval); +} + + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) \ + do { \ + size_t num = (num_bytes); \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SEQUENCE_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + size_t edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Skipping unknown extensions. + * Phase 4: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 3;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the inner member of a sequence. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr_dontuse; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr_dontuse = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr_dontuse; /* Only use of memb_ptr_dontuse */ + } + + if(elm->flags & ATF_OPEN_TYPE) { + tmprval = OPEN_TYPE_xer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + /* Invoke the inner type decoder, m.b. multiple times */ + tmprval = elm->type->op->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + ptr, size); + } + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; /* Back to body processing */ + ctx->step = ++edx; + ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", + ctx->phase, ctx->step); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", + tcv, ctx->phase, xml_tag); + + /* Skip the extensions section */ + if(ctx->phase == 3) { + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 4; + RETURN(RC_FAIL); + case 0: + XER_ADVANCE(ch_size); + continue; + case 1: + XER_ADVANCE(ch_size); + ctx->phase = 1; + continue; + case 2: + ctx->phase = 1; + break; + } + } + + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional == td->elements_count) || + /* All extensions are optional */ + IN_EXTENSION_GROUP(specs, edx)) { + XER_ADVANCE(ch_size); + ctx->phase = 4; /* Phase out */ + RETURN(RC_OK); + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%" ASN_PRI_SIZE "", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { + break; /* Really unexpected */ + } + + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + size_t n; + size_t edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(ptr, ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %" ASN_PRI_SIZE "/%u", + edx, td->elements_count); + } + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %" ASN_PRI_SIZE "", + edx); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + } else { + ctx->left = 1; + ctx->phase = 3; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", + size>0?((const char *)ptr)[0]:'.', + size>1?((const char *)ptr)[1]:'.', + size>2?((const char *)ptr)[2]:'.', + size>3?((const char *)ptr)[3]:'.', + size>4?((const char *)ptr)[4]:'.', + size>5?((const char *)ptr)[5]:'.'); + break; + } + + ctx->phase = 4; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + +asn_enc_rval_t +SEQUENCE_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + int xcan = (flags & XER_F_CANONICAL); + asn_TYPE_descriptor_t *tmp_def_val_td = 0; + void *tmp_def_val = 0; + size_t edx; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper = {0,0,0}; + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = + *(const void *const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + assert(tmp_def_val == 0); + if(elm->default_value_set) { + if(elm->default_value_set(&tmp_def_val)) { + ASN__ENCODE_FAILED; + } else { + memb_ptr = tmp_def_val; + tmp_def_val_td = elm->type; + } + } else if(elm->optional) { + continue; + } else { + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmp_def_val) { + ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + tmp_def_val = 0; + } + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + + ASN__CALLBACK3("", 1); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + if(tmp_def_val) ASN_STRUCT_FREE(*tmp_def_val_td, tmp_def_val); + ASN__ENCODE_FAILED; +} + +int +SEQUENCE_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t edx; + int ret; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Print line */ + /* Fall through */ + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + _i_INDENT(1); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + + /* Print the member itself */ + ret = elm->type->op->print_struct(elm->type, memb_ptr, ilevel + 1, + cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SEQUENCE_free(const asn_TYPE_descriptor_t *td, void *sptr, + enum asn_struct_free_method method) { + size_t edx; + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_struct_ctx_t *ctx; /* Decoder context */ + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + /* Clean parsing context */ + ctx = (asn_struct_ctx_t *)((char *)sptr + specs->ctx_offset); + FREEMEM(ctx->ptr); + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(sptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset( + sptr, 0, + ((const asn_SEQUENCE_specifics_t *)(td->specifics))->struct_size); + break; + } +} + +int +SEQUENCE_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + size_t edx; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->encoding_constraints.general_constraints) { + int ret = elm->encoding_constraints.general_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + if(ret) return ret; + } else { + return elm->type->encoding_constraints.general_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + } + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SEQUENCE_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; + edx < (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_uper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = uper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, (long)bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, + *memb_ptr2); + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + ASN_DEBUG("Skipped overflow extension"); + continue; + } + break; + } + + FREEMEM(epres); + } + + if(specs->first_extension >= 0) { + unsigned i; + /* Fill DEFAULT members in extensions */ + for(i = specs->roms_count; i < specs->roms_count + specs->aoms_count; + i++) { + asn_TYPE_member_t *elm; + void **memb_ptr2; /* Pointer to member pointer */ + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE__handle_extensions(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s:%s (@%" ASN_PRI_SIZE ") present => %d", elm->name, + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) { + return -1; + } + /* Encode as open type field */ + if(po2 && present + && uper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, + *memb_ptr2, po2)) + return -1; + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE__handle_extensions(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(*memb_ptr2) == 0) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void *const *memb_ptr2; /* Pointer to that pointer */ + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = + (const void *const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %" ASN_PRI_SIZE " not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(*memb_ptr2) == 0) + continue; + + ASN_DEBUG("Encoding %s->%s:%s", td->name, elm->name, elm->type->name); + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, *memb_ptr2, + po); + if(er.encoded == -1) return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of extensions %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE__handle_extensions(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE__handle_extensions(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +SEQUENCE_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + size_t edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (APER)", td->name); + + /* Handle extensions */ + if(specs->first_extension < 0) { + extpresent = 0; + } else { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ +#if 0 + int padding; +#endif + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } +#if 0 + /* Get Padding */ + padding = (8 - (pd->moved % 8)) % 8; + if(padding > 0) + ASN_DEBUG("For element %s,offset= %ld Padding bits = %d", td->name, pd->moved, padding); +#if 0 /* old way of removing padding */ + per_get_few_bits(pd, padding); +#else /* Experimental fix proposed by @mhanna123 */ + if(edx != (td->elements_count-1)) + per_get_few_bits(pd, padding); + else { + if(specs->roms_count && (padding > 0)) + ASN_DEBUG(">>>>> not skipping padding of %d bits for element:%ld out of %d", padding, edx, td->elements_count); + else + per_get_few_bits(pd, padding); + } +#endif /* dealing with padding */ +#endif + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + if(elm->default_value_set(memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member \"%s\" in %s", elm->name, td->name); + + if(elm->flags & ATF_OPEN_TYPE) { + rv = OPEN_TYPE_aper_get(opt_codec_ctx, td, st, elm, pd); + } else { + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + } + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = aper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %" ASN_PRI_SSIZE " present in %s", bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) + ASN__DECODE_STARVED; + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%ld is not extension", edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = aper_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: + break; + case 0: + continue; + default: + if(aper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + } + break; + } + + FREEMEM(epres); + } + + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value_set) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value_set(memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE_handle_extensions_aper(const asn_TYPE_descriptor_t *td, + const void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + size_t edx; + + if(specs->first_extension < 0) { + return 0; + } + + /* Find out which extensions are present */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%s (@%ld) is not extension", elm->type->name, edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s (@%ld) present => %d", + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && aper_open_type_put(elm->type, + elm->encoding_constraints.per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_SEQUENCE_specifics_t *specs + = (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er = {0,0,0}; + int n_extensions; + size_t edx; + size_t i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (APER)", td->name); + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->first_extension < 0) { + n_extensions = 0; /* There are no extensions to encode */ + } else { + n_extensions = SEQUENCE_handle_extensions_aper(td, sptr, 0, 0); + if(n_extensions < 0) ASN__ENCODE_FAILED; + if(per_put_few_bits(po, n_extensions ? 1 : 0, 1)) { + ASN__ENCODE_FAILED; + } + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr2) == 1) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value_cmp ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("first_extension = %d, elements = %d", specs->first_extension, + td->elements_count); + for(edx = 0; + edx < ((specs->first_extension < 0) ? td->elements_count + : (size_t)specs->first_extension); + edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; /* Pointer to the member */ + const void * const *memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (const void * const *)((const char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %ld not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value_cmp && elm->default_value_cmp(memb_ptr2) == 1) + continue; + + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); + er = elm->type->op->aper_encoder(elm->type, elm->encoding_constraints.per_constraints, + *memb_ptr2, po); + if(er.encoded == -1) + return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(aper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions_aper(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions_aper(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + size_t edx; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *amemb; + const void *bmemb; + int ret; + + if(elm->flags & ATF_POINTER) { + amemb = + *(const void *const *)((const char *)aptr + elm->memb_offset); + bmemb = + *(const void *const *)((const char *)bptr + elm->memb_offset); + if(!amemb) { + if(!bmemb) continue; + if(elm->default_value_cmp + && elm->default_value_cmp(bmemb) == 0) { + /* A is absent, but B is present and equal to DEFAULT */ + continue; + } + return -1; + } else if(!bmemb) { + if(elm->default_value_cmp + && elm->default_value_cmp(amemb) == 0) { + /* B is absent, but A is present and equal to DEFAULT */ + continue; + } + return 1; + } + } else { + amemb = (const void *)((const char *)aptr + elm->memb_offset); + bmemb = (const void *)((const char *)bptr + elm->memb_offset); + } + + ret = elm->type->op->compare_struct(elm->type, amemb, bmemb); + if(ret != 0) return ret; + } + + return 0; +} + +asn_TYPE_operation_t asn_OP_SEQUENCE = { + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_compare, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_decode_oer, + SEQUENCE_encode_oer, +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_decode_uper, + SEQUENCE_encode_uper, + SEQUENCE_decode_aper, + SEQUENCE_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SEQUENCE_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constr, + size_t max_length) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_random_fill_result_t result_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + void *st = *sptr; + size_t edx; + + if(max_length == 0) return result_skipped; + + (void)constr; + + if(st == NULL) { + st = CALLOC(1, specs->struct_size); + if(st == NULL) { + return result_failed; + } + } + + for(edx = 0; edx < td->elements_count; edx++) { + const asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + asn_random_fill_result_t tmpres; + + if(elm->optional && asn_random_between(0, 4) == 2) { + /* Sometimes decide not to fill the optional value */ + continue; + } + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + tmpres = elm->type->op->random_fill( + elm->type, memb_ptr2, &elm->encoding_constraints, + max_length > result_ok.length ? max_length - result_ok.length : 0); + switch(tmpres.code) { + case ARFILL_OK: + result_ok.length += tmpres.length; + continue; + case ARFILL_SKIPPED: + assert(!(elm->flags & ATF_POINTER) || *memb_ptr2 == NULL); + continue; + case ARFILL_FAILED: + if(st == *sptr) { + ASN_STRUCT_RESET(*td, st); + } else { + ASN_STRUCT_FREE(*td, st); + } + return tmpres; + } + } + + *sptr = st; + + return result_ok; +} + diff --git a/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.h b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.h new file mode 100644 index 000000000..a22ed3a27 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* + * Tags to members mapping table (sorted). + */ + const asn_TYPE_tag2member_t *tag2el; + unsigned tag2el_count; + + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + const int *oms; /* Optional MemberS */ + unsigned roms_count; /* Root optional members count */ + unsigned aoms_count; /* Additions optional members count */ + + /* + * Description of an extensions group. + * Root components are clustered at the beginning of the structure, + * whereas extensions are clustered at the end. -1 means not extensible. + */ + signed first_extension; /* First extension addition */ +} asn_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; +asn_struct_compare_f SEQUENCE_compare; +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; +xer_type_encoder_f SEQUENCE_encode_xer; +oer_type_decoder_f SEQUENCE_decode_oer; +oer_type_encoder_f SEQUENCE_encode_oer; +per_type_decoder_f SEQUENCE_decode_uper; +per_type_encoder_f SEQUENCE_encode_uper; +per_type_decoder_f SEQUENCE_decode_aper; +per_type_encoder_f SEQUENCE_encode_aper; +asn_random_fill_f SEQUENCE_random_fill; +extern asn_TYPE_operation_t asn_OP_SEQUENCE; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.c b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.c new file mode 100644 index 000000000..10f18cf46 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.c @@ -0,0 +1,358 @@ +/*- + * Copyright (c) 2003, 2004, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The DER encoder of the SEQUENCE OF type. + */ +asn_enc_rval_t +SEQUENCE_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(ptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + asn_enc_rval_t erval = {0,0,0}; + int edx; + + ASN_DEBUG("Estimating size of SEQUENCE OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + computed_size += encoding_size; + if(!cb) { + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of SEQUENCE OF %s", td->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = elm->type->op->der_encoder(elm->type, memb_ptr, + 0, elm->tag, + cb, app_key); + if(erval.encoded == -1) + return erval; + encoding_size += erval.encoded; + } + + if(computed_size != (size_t)encoding_size) { + /* + * Encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + erval.structure_ptr = 0; + erval.failed_type = 0; + } + + return erval; +} + +asn_enc_rval_t +SEQUENCE_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_sequence_ *list = _A_CSEQUENCE_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 + : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, ilevel + 1, + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + if(!xcan) ASN__TEXT_INDENT(1, ilevel + 1); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_enc_rval_t +SEQUENCE_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + const asn_TYPE_member_t *elm = td->elements; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->uper_encoder( + elm->type, elm->encoding_constraints.per_constraints, memb_ptr, + po); + if(er.encoded == -1) ASN__ENCODE_FAILED; + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + ASN__ENCODED_OK(er); +} + +asn_enc_rval_t +SEQUENCE_OF_encode_aper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, + const void *sptr, asn_per_outp_t *po) { + const asn_anonymous_sequence_ *list; + const asn_per_constraint_t *ct; + asn_enc_rval_t er = {0,0,0}; + asn_TYPE_member_t *elm = td->elements; + int seq; + + if(!sptr) ASN__ENCODE_FAILED; + list = _A_CSEQUENCE_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF size (%d) using ALIGNED PER", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = (list->count < ct->lower_bound + || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", + ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) + ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) + ASN__ENCODE_FAILED; + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ +/* if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; +*/ + if (aper_put_length(po, ct->upper_bound - ct->lower_bound + 1, list->count - ct->lower_bound) < 0) + ASN__ENCODE_FAILED; + } + + for(seq = -1; seq < list->count;) { + ssize_t mayEncode; + if(seq < 0) seq = 0; + if(ct && ct->effective_bits >= 0) { + mayEncode = list->count; + } else { + mayEncode = aper_put_length(po, -1, list->count - seq); + if(mayEncode < 0) ASN__ENCODE_FAILED; + } + + while(mayEncode--) { + void *memb_ptr = list->array[seq++]; + if(!memb_ptr) ASN__ENCODE_FAILED; + er = elm->type->op->aper_encoder(elm->type, + elm->encoding_constraints.per_constraints, memb_ptr, po); + if(er.encoded == -1) + ASN__ENCODE_FAILED; + } + } + + ASN__ENCODED_OK(er); +} +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +SEQUENCE_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_sequence_ *a = _A_CSEQUENCE_FROM_VOID(aptr); + const asn_anonymous_sequence_ *b = _A_CSEQUENCE_FROM_VOID(bptr); + ssize_t idx; + + if(a && b) { + ssize_t common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, a->array[idx], b->array[idx]); + if(ret) return ret; + } + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SEQUENCE_OF = { + SEQUENCE_OF_free, + SEQUENCE_OF_print, + SEQUENCE_OF_compare, + SEQUENCE_OF_decode_ber, + SEQUENCE_OF_encode_der, + SEQUENCE_OF_decode_xer, + SEQUENCE_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SEQUENCE_OF_decode_oer, /* Same as SET OF decoder. */ + SEQUENCE_OF_encode_oer, /* Same as SET OF encoder */ +#endif /* ASN_DISABLE_OER_SUPPORT */ +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SEQUENCE_OF_decode_uper, /* Same as SET OF decoder */ + SEQUENCE_OF_encode_uper, + SEQUENCE_OF_decode_aper, + SEQUENCE_OF_encode_aper, +#endif /* ASN_DISABLE_PER_SUPPORT */ + SEQUENCE_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + diff --git a/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.h b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.h new file mode 100644 index 000000000..6857f0f0c --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_OF.h @@ -0,0 +1,41 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_OF_H_ +#define _CONSTR_SEQUENCE_OF_H_ + +#include +#include /* Implemented using SET OF */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * A set specialized functions dealing with the SEQUENCE OF type. + * Generally implemented using SET OF. + */ +asn_struct_compare_f SEQUENCE_OF_compare; +der_type_encoder_f SEQUENCE_OF_encode_der; +xer_type_encoder_f SEQUENCE_OF_encode_xer; +per_type_encoder_f SEQUENCE_OF_encode_uper; +per_type_encoder_f SEQUENCE_OF_encode_aper; +extern asn_TYPE_operation_t asn_OP_SEQUENCE_OF; + +#define SEQUENCE_OF_free SET_OF_free +#define SEQUENCE_OF_print SET_OF_print +#define SEQUENCE_OF_constraint SET_OF_constraint +#define SEQUENCE_OF_decode_ber SET_OF_decode_ber +#define SEQUENCE_OF_decode_xer SET_OF_decode_xer +#define SEQUENCE_OF_decode_oer SET_OF_decode_oer +#define SEQUENCE_OF_encode_oer SET_OF_encode_oer +#define SEQUENCE_OF_decode_uper SET_OF_decode_uper +#define SEQUENCE_OF_decode_aper SET_OF_decode_aper +#define SEQUENCE_OF_random_fill SET_OF_random_fill + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_oer.c b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_oer.c new file mode 100644 index 000000000..ecb589cc3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SEQUENCE_oer.c @@ -0,0 +1,561 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ((specs)->first_extension >= 0 \ + && (unsigned)(specs)->first_extension <= (memb_idx)) + +#define IN_ROOT_GROUP_PRED(edx) \ + edx < (specs->first_extension < 0 ? td->elements_count \ + : (size_t)specs->first_extension) + +#define FOR_IN_ROOT_GROUP(edx) for(edx = 0; IN_ROOT_GROUP_PRED(edx); edx++) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Return pointer to a member. + */ +static void ** +element_ptrptr(void *struct_ptr, asn_TYPE_member_t *elm, void **tmp_save_ptr) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return (void **)((char *)struct_ptr + elm->memb_offset); + } else { + assert(tmp_save_ptr); + *tmp_save_ptr = (void *)((char *)struct_ptr + elm->memb_offset); + return tmp_save_ptr; + } +} + +static const void * +element_ptr(const void *struct_ptr, const asn_TYPE_member_t *elm) { + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + return *(const void *const *)((const char *)struct_ptr + + elm->memb_offset); + } else { + return (const void *)((const char *)struct_ptr + elm->memb_offset); + } +} + +asn_dec_rval_t +SEQUENCE_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SEQUENCE_specifics_t *specs = + (const asn_SEQUENCE_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch preamble. + */ + asn_bit_data_t *preamble; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + size_t preamble_bytes = ((7 + preamble_bits) >> 3); + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 0", td->name); + + ASN_DEBUG( + "Expecting preamble bits %" ASN_PRI_SIZE " for %s (including %d extension bits)", + preamble_bits, td->name, has_extensions_bit); + + if(preamble_bytes > size) { + ASN__DECODE_STARVED; + } + + preamble = asn_bit_data_new_contiguous(ptr, preamble_bits); + if(!preamble) { + RETURN(RC_FAIL); + } + preamble->nboff = has_extensions_bit; + ctx->ptr = preamble; + ADVANCE(preamble_bytes); + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_bit_data_t *preamble = ctx->ptr; + size_t edx; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 1 (Root)", td->name); + + assert(preamble); + + for(edx = (ctx->step >> 1); IN_ROOT_GROUP_PRED(edx); + edx++, ctx->step = (ctx->step & ~1) + 2) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + ASN_DEBUG("Decoding %s->%s", td->name, elm->name); + + assert(!IN_EXTENSION_GROUP(specs, edx)); + + if(ctx->step & 1) { + goto microphase2_decode_continues; + } + + + if(elm->optional) { + int32_t present = asn_get_few_bits(preamble, 1); + if(present < 0) { + ASN_DEBUG("Presence map ended prematurely: %d", present); + RETURN(RC_FAIL); + } else if(present == 0) { + if(elm->default_value_set) { + /* Fill-in DEFAULT */ + void *tmp; + if(elm->default_value_set( + element_ptrptr(st, elm, &tmp))) { + RETURN(RC_FAIL); + } + } + /* The member is not present. */ + continue; + } + /* Present OPTIONAL or DEFAULT component. */ + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2_decode_continues: + if(elm->flags & ATF_OPEN_TYPE) { + rval = OPEN_TYPE_oer_get(opt_codec_ctx, td, st, elm, ptr, size); + } else { + void *save_memb_ptr; /* Temporary reference. */ + void **memb_ptr2; /* Pointer to a pointer to a memmber */ + + memb_ptr2 = element_ptrptr(st, elm, &save_memb_ptr); + + rval = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, memb_ptr2, ptr, + size); + } + switch(rval.code) { + case RC_OK: + ADVANCE(rval.consumed); + break; + case RC_WMORE: + ASN_DEBUG("More bytes needed at element %s \"%s\"", td->name, + elm->name); + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + case RC_FAIL: + ASN_DEBUG("Decoding failed at element %s \"%s\"", td->name, + elm->name); + RETURN(RC_FAIL); + } + } /* for(all root members) */ + + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 2: + assert(ctx->ptr); + { + /* Cleanup preamble. */ + asn_bit_data_t *preamble = ctx->ptr; + asn_bit_data_t *extadds; + int has_extensions_bit = (specs->first_extension >= 0); + int extensions_present = + has_extensions_bit + && (preamble->buffer == NULL + || (((const uint8_t *)preamble->buffer)[0] & 0x80)); + uint8_t unused_bits; + size_t len = 0; + ssize_t len_len; + + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 2", td->name); + + preamble->buffer = 0; /* Will do extensions_present==1 next time. */ + + if(!extensions_present) { + ctx->phase = 10; + RETURN(RC_OK); + } + + /* + * X.696 (08/2015) #16.1 (c), #16.4 + * Read in the extension addition presence bitmap. + */ + + len_len = oer_fetch_length(ptr, size, &len); + if(len_len > 0) { + ADVANCE(len_len); + } else if(len_len < 0) { + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + + if(len == 0) { + /* 16.4.1-2 */ + RETURN(RC_FAIL); + } else if(len > size) { + RETURN(RC_WMORE); + } + + /* Account for unused bits */ + unused_bits = 0x7 & *(const uint8_t *)ptr; + ADVANCE(1); + len--; + if(unused_bits && len == 0) { + RETURN(RC_FAIL); + } + + /* Get the extensions map */ + extadds = asn_bit_data_new_contiguous(ptr, len * 8 - unused_bits); + if(!extadds) { + RETURN(RC_FAIL); + } + FREEMEM(preamble); + ctx->ptr = extadds; + ADVANCE(len); + } + NEXT_PHASE(ctx); + ctx->step = + (specs->first_extension < 0 ? td->elements_count + : (size_t)specs->first_extension); + /* Fall through */ + case 3: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 3 (Extensions)", td->name); + for(; ctx->step < (signed)td->elements_count; ctx->step++) { + asn_bit_data_t *extadds = ctx->ptr; + size_t edx = ctx->step; + asn_TYPE_member_t *elm = &td->elements[edx]; + void *tmp_memb_ptr; + void **memb_ptr2 = element_ptrptr(st, elm, &tmp_memb_ptr); + + switch(asn_get_few_bits(extadds, 1)) { + case -1: + /* + * Not every one of our extensions is known to the remote side. + * Continue filling in their defaults though. + */ + /* Fall through */ + case 0: + /* Fill-in DEFAULT */ + if(elm->default_value_set + && elm->default_value_set(memb_ptr2)) { + RETURN(RC_FAIL); + } + continue; + case 1: { + /* Read OER open type */ + ssize_t ot_size = + oer_open_type_get(opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, + memb_ptr2, ptr, size); + assert(ot_size <= (ssize_t)size); + if(ot_size > 0) { + ADVANCE(ot_size); + } else if(ot_size < 0) { + RETURN(RC_FAIL); + } else { + /* Roll back open type parsing */ + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + break; + } + default: + RETURN(RC_FAIL); + } + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 4: + ASN_DEBUG("OER SEQUENCE %s Decoding PHASE 4", td->name); + /* Read in the rest of Open Types while ignoring them */ + for(;;) { + asn_bit_data_t *extadds = ctx->ptr; + switch(asn_get_few_bits(extadds, 1)) { + case 0: + continue; + case 1: { + ssize_t skipped = oer_open_type_skip(ptr, size); + if(skipped > 0) { + ADVANCE(skipped); + } else if(skipped < 0) { + RETURN(RC_FAIL); + } else { + asn_get_undo(extadds, 1); + RETURN(RC_WMORE); + } + continue; + } + case -1: + /* No more Open Type encoded components */ + break; + default: + RETURN(RC_FAIL); + } + break; + } + } + + RETURN(RC_OK); +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SEQUENCE_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_SEQUENCE_specifics_t *specs = (const asn_SEQUENCE_specifics_t *)td->specifics; + size_t computed_size = 0; + int has_extensions_bit = (specs->first_extension >= 0); + size_t preamble_bits = (has_extensions_bit + specs->roms_count); + uint32_t has_extensions = 0; + size_t edx; + int ret; + + (void)constraints; + + if(preamble_bits) { + asn_bit_outp_t preamble; + + memset(&preamble, 0, sizeof(preamble)); + preamble.output = cb; + preamble.op_key = app_key; + + if(has_extensions_bit) { + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default values in extensions */ + } else { + has_extensions = 1; + break; + } + } + } + ret = asn_put_few_bits(&preamble, has_extensions, 1); + assert(ret == 0); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + + /* + * Encode optional components bitmap. + */ + if(specs->roms_count) { + FOR_IN_ROOT_GROUP(edx) { + asn_TYPE_member_t *elm = &td->elements[edx]; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + if(elm->optional) { + const void *memb_ptr = element_ptr(sptr, elm); + uint32_t has_component = memb_ptr != NULL; + if(has_component && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + has_component = 0; + } + ret = asn_put_few_bits(&preamble, has_component, 1); + if(ret < 0) { + ASN__ENCODE_FAILED; + } + } + } + } + + asn_put_aligned_flush(&preamble); + computed_size += preamble.flushed_bytes; + } /* if(preamble_bits) */ + + /* + * Put root components and extensions root. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t er = {0,0,0}; + const void *memb_ptr; + + if(IN_EXTENSION_GROUP(specs, edx)) break; + + memb_ptr = element_ptr(sptr, elm); + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Skip default values in encoding */ + continue; + } + } else { + if(elm->optional) continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + if(!elm->type->op->oer_encoder) { + ASN_DEBUG("OER encoder is not defined for type %s", elm->type->name); + ASN__ENCODE_FAILED; + } + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded == -1) { + ASN_DEBUG("... while encoding %s member \"%s\"\n", td->name, + elm->name); + return er; + } + computed_size += er.encoded; + } + + /* + * Before encode extensions, encode extensions additions presense bitmap + # X.696 (08/2015) #16.4. + */ + if(has_extensions) { + asn_bit_outp_t extadds; + + /* Special case allowing us to use exactly one byte for #8.6 */ + size_t aoms_length_bits = specs->aoms_count; + size_t aoms_length_bytes = (7 + aoms_length_bits) >> 3; + uint8_t unused_bits = 0x07 & (8 - (aoms_length_bits & 0x07)); + + assert(1 + aoms_length_bytes <= 127); + + memset(&extadds, 0, sizeof(extadds)); + extadds.output = cb; + extadds.op_key = app_key; + + /* #8.6 length determinant */ + ret = asn_put_few_bits(&extadds, (1 + aoms_length_bytes), 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Number of unused bytes, #16.4.2 */ + ret = asn_put_few_bits(&extadds, unused_bits, 8); + if(ret < 0) ASN__ENCODE_FAILED; + + /* Encode presence bitmap #16.4.3 */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + if(memb_ptr && elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + memb_ptr = 0; /* Do not encode default value. */ + } + ret |= asn_put_few_bits(&extadds, memb_ptr ? 1 : 0, 1); + } + if(ret < 0) ASN__ENCODE_FAILED; + + asn_put_aligned_flush(&extadds); + computed_size += extadds.flushed_bytes; + + /* Now, encode extensions */ + for(edx = specs->first_extension; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr = element_ptr(sptr, elm); + + if(memb_ptr) { + if(elm->default_value_cmp + && elm->default_value_cmp(memb_ptr) == 0) { + /* Do not encode default value. */ + } else { + ssize_t wrote = oer_open_type_put( + elm->type, elm->encoding_constraints.oer_constraints, + memb_ptr, cb, app_key); + if(wrote == -1) { + ASN__ENCODE_FAILED; + } + computed_size += wrote; + } + } else if(!elm->optional) { + ASN__ENCODE_FAILED; + } + } + } /* if(has_extensions) */ + + + { + asn_enc_rval_t er = {0, 0, 0}; + er.encoded = computed_size; + ASN__ENCODED_OK(er); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_OLD1/constr_SET_OF.c b/src/codec_utils/E2AP_OLD1/constr_SET_OF.c new file mode 100644 index 000000000..bf1dc2776 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SET_OF.c @@ -0,0 +1,1441 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_ber(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", td->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(elm->tag != (ber_tlv_tag_t)-1) { + if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), td->name); + ASN_DEBUG("%s SET OF has tag %s", + td->name, ber_tlv_tag_string(elm->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->op->ber_decoder(opt_codec_ctx, + elm->type, &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + td->name, elm->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((const char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((const char *)ptr)[0] == 0 + && ((const char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t allocated_size; + unsigned bits_unused; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; + + if(el_buf->length + size > el_buf->allocated_size) { + size_t new_size = el_buf->allocated_size ? el_buf->allocated_size : 8; + void *p; + + do { + new_size <<= 2; + } while(el_buf->length + size > new_size); + + p = REALLOC(el_buf->buf, new_size); + if(p) { + el_buf->buf = p; + el_buf->allocated_size = new_size; + } else { + return -1; + } + } + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} + +static void assert_unused_bits(const struct _el_buffer* p) { + if(p->length) { + assert((p->buf[p->length-1] & ~(0xff << p->bits_unused)) == 0); + } else { + assert(p->bits_unused == 0); + } +} + +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; + size_t common_len; + int ret = 0; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + if (a->buf && b->buf) { + ret = memcmp(a->buf, b->buf, common_len); + } + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + /* Ignore unused bits. */ + assert_unused_bits(a); + assert_unused_bits(b); + } + + return ret; +} + +static void +SET_OF__encode_sorted_free(struct _el_buffer *el_buf, size_t count) { + size_t i; + + for(i = 0; i < count; i++) { + FREEMEM(el_buf[i].buf); + } + + FREEMEM(el_buf); +} + +enum SET_OF__encode_method { + SOES_DER, /* Distinguished Encoding Rules */ + SOES_CUPER /* Canonical Unaligned Packed Encoding Rules */ +}; + +static struct _el_buffer * +SET_OF__encode_sorted(const asn_TYPE_member_t *elm, + const asn_anonymous_set_ *list, + enum SET_OF__encode_method method) { + struct _el_buffer *encoded_els; + int edx; + + encoded_els = + (struct _el_buffer *)CALLOC(list->count, sizeof(encoded_els[0])); + if(encoded_els == NULL) { + return NULL; + } + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + const void *memb_ptr = list->array[edx]; + struct _el_buffer *encoding_el = &encoded_els[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) break; + + /* + * Encode the member into the prepared space. + */ + switch(method) { + case SOES_DER: + erval = elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, + _el_addbytes, encoding_el); + break; + case SOES_CUPER: + erval = uper_encode(elm->type, + elm->encoding_constraints.per_constraints, + memb_ptr, _el_addbytes, encoding_el); + if(erval.encoded != -1) { + size_t extra_bits = erval.encoded % 8; + assert(encoding_el->length == (size_t)(erval.encoded + 7) / 8); + encoding_el->bits_unused = (8 - extra_bits) & 0x7; + } + break; + default: + assert(!"Unreachable"); + break; + } + if(erval.encoded < 0) break; + } + + if(edx == list->count) { + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, list->count, sizeof(encoded_els[0]), _el_buf_cmp); + + return encoded_els; + } else { + SET_OF__encode_sorted_free(encoded_els, edx); + return NULL; + } +} + + +/* + * The DER encoder of the SET OF type. + */ +asn_enc_rval_t +SET_OF_encode_der(const asn_TYPE_descriptor_t *td, const void *sptr, + int tag_mode, ber_tlv_tag_t tag, asn_app_consume_bytes_f *cb, + void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + asn_enc_rval_t erval = {0,0,0}; + + if(!memb_ptr) ASN__ENCODE_FAILED; + + erval = + elm->type->op->der_encoder(elm->type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) return erval; + computed_size += erval.encoded; + } + + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = + der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + if(encoding_size < 0) { + ASN__ENCODE_FAILED; + } + computed_size += encoding_size; + + if(!cb || list->count == 0) { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + ASN_DEBUG("Encoding members of %s SET OF", td->name); + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_DER); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + for(edx = 0; edx < list->count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(cb(encoded_el->buf, encoded_el->length, app_key) < 0) { + break; + } else { + encoding_size += encoded_el->length; + } + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if(edx == list->count) { + asn_enc_rval_t erval = {0,0,0}; + assert(computed_size == (size_t)encoding_size); + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } else { + ASN__ENCODE_FAILED; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SET_OF_decode_xer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, void **struct_ptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *element = td->elements; + const char *elm_tag; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval = {RC_OK, 0};/* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + for(; ctx->phase <= 2;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Go inside the inner member of a set. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval = {RC_OK, 0}; + + /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); + tmprval = element->type->op->xer_decoder(opt_codec_ctx, + element->type, &ctx->ptr, elm_tag, + buf_ptr, size); + if(tmprval.code == RC_OK) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + ctx->ptr = 0; + XER_ADVANCE(tmprval.consumed); + } else { + XER_ADVANCE(tmprval.consumed); + RETURN(tmprval.code); + } + ctx->phase = 1; /* Back to body processing */ + ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + /* No more things to decode */ + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + RETURN(RC_OK); + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); + if(ctx->phase == 1) { + /* + * Process a single possible member. + */ + ctx->phase = 2; + continue; + } + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SET OF"); + break; + } + + ctx->phase = 3; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + + + +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + +asn_enc_rval_t +SET_OF_encode_xer(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + enum xer_encoder_flags_e flags, asn_app_consume_bytes_f *cb, + void *app_key) { + asn_enc_rval_t er = {0,0,0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper = {0,0,0}; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->op->xer_encoder(elm->type, memb_ptr, + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + er.encoded += tmper.encoded; + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + } + + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + er.encoded = 0; + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + ASN__CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + ASN__ENCODE_FAILED; +cleanup: + if(encs) { + size_t n; + for(n = 0; n < encs_count; n++) { + FREEMEM(encs[n].buffer); + } + FREEMEM(encs); + } + ASN__ENCODED_OK(er); +} + +int +SET_OF_print(const asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int ret; + int i; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + _i_INDENT(1); + + ret = elm->type->op->print_struct(elm->type, memb_ptr, + ilevel + 1, cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SET_OF_free(const asn_TYPE_descriptor_t *td, void *ptr, + enum asn_struct_free_method method) { + if(td && ptr) { + const asn_SET_OF_specifics_t *specs; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ + + specs = (const asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + + switch(method) { + case ASFM_FREE_EVERYTHING: + FREEMEM(ptr); + break; + case ASFM_FREE_UNDERLYING: + break; + case ASFM_FREE_UNDERLYING_AND_RESET: + memset(ptr, 0, specs->struct_size); + break; + } + } +} + +int +SET_OF_constraint(const asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const asn_TYPE_member_t *elm = td->elements; + asn_constr_check_f *constr; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int i; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + constr = elm->encoding_constraints.general_constraints; + if(!constr) constr = elm->type->encoding_constraints.general_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + int ret; + + if(!memb_ptr) continue; + + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; + } + + return 0; +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +SET_OF_decode_uper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, + asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, -1, 0, &repeat); + ASN_DEBUG("Got to decode %" ASN_PRI_SSIZE " elements (eff %d)", + nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->uper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) { + if(rv.consumed == 0 && nelems > 200) { + /* Protect from SET OF NULL compression bombs. */ + ASN__DECODE_FAILED; + } + continue; + } + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +asn_enc_rval_t +SET_OF_encode_uper(const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, const void *sptr, + asn_per_outp_t *po) { + const asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + const asn_TYPE_member_t *elm = td->elements; + struct _el_buffer *encoded_els; + asn_enc_rval_t er = {0,0,0}; + size_t encoded_edx; + + if(!sptr) ASN__ENCODE_FAILED; + + list = _A_CSET_FROM_VOID(sptr); + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE OF (%d)", td->name, list->count); + + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + /* If extensible constraint, check if size is in root */ + if(ct) { + int not_in_root = + (list->count < ct->lower_bound || list->count > ct->upper_bound); + ASN_DEBUG("lb %ld ub %ld %s", ct->lower_bound, ct->upper_bound, + ct->flags & APC_EXTENSIBLE ? "ext" : "fix"); + if(ct->flags & APC_EXTENSIBLE) { + /* Declare whether size is in extension root */ + if(per_put_few_bits(po, not_in_root, 1)) ASN__ENCODE_FAILED; + if(not_in_root) ct = 0; + } else if(not_in_root && ct->effective_bits >= 0) { + ASN__ENCODE_FAILED; + } + + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + if(per_put_few_bits(po, list->count - ct->lower_bound, + ct->effective_bits)) + ASN__ENCODE_FAILED; + } else if(list->count == 0) { + /* When the list is empty add only the length determinant + * X.691, #20.6 and #11.9.4.1 + */ + if (uper_put_length(po, 0, 0)) { + ASN__ENCODE_FAILED; + } + ASN__ENCODED_OK(er); + } + + + /* + * Canonical UPER #22.1 mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the encoded elements. + */ + encoded_els = SET_OF__encode_sorted(elm, list, SOES_CUPER); + + for(encoded_edx = 0; (ssize_t)encoded_edx < list->count;) { + ssize_t may_encode; + size_t edx; + int need_eom = 0; + + if(ct && ct->effective_bits >= 0) { + may_encode = list->count; + } else { + may_encode = + uper_put_length(po, list->count - encoded_edx, &need_eom); + if(may_encode < 0) ASN__ENCODE_FAILED; + } + + for(edx = encoded_edx; edx < encoded_edx + may_encode; edx++) { + const struct _el_buffer *el = &encoded_els[edx]; + if(asn_put_many_bits(po, el->buf, + (8 * el->length) - el->bits_unused) < 0) { + break; + } + } + + if(need_eom && uper_put_length(po, 0, 0)) + ASN__ENCODE_FAILED; /* End of Message length */ + + encoded_edx += may_encode; + } + + SET_OF__encode_sorted_free(encoded_els, list->count); + + if((ssize_t)encoded_edx == list->count) { + ASN__ENCODED_OK(er); + } else { + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +SET_OF_decode_aper(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv = {RC_OK, 0}; + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + const asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + const asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->encoding_constraints.per_constraints) + ct = &td->encoding_constraints.per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = aper_get_nsnnwn(pd, ct->upper_bound - ct->lower_bound + 1); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = aper_get_length(pd, ct ? ct->upper_bound - ct->lower_bound + 1 : -1, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + (int)nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->op->aper_decoder(opt_codec_ctx, elm->type, + elm->encoding_constraints.per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +struct comparable_ptr { + const asn_TYPE_descriptor_t *td; + const void *sptr; +}; + +static int +SET_OF__compare_cb(const void *aptr, const void *bptr) { + const struct comparable_ptr *a = aptr; + const struct comparable_ptr *b = bptr; + assert(a->td == b->td); + return a->td->op->compare_struct(a->td, a->sptr, b->sptr); +} + +int +SET_OF_compare(const asn_TYPE_descriptor_t *td, const void *aptr, + const void *bptr) { + const asn_anonymous_set_ *a = _A_CSET_FROM_VOID(aptr); + const asn_anonymous_set_ *b = _A_CSET_FROM_VOID(bptr); + + if(a && b) { + struct comparable_ptr *asorted; + struct comparable_ptr *bsorted; + ssize_t common_length; + ssize_t idx; + + if(a->count == 0) { + if(b->count) return -1; + return 0; + } else if(b->count == 0) { + return 1; + } + + asorted = MALLOC(a->count * sizeof(asorted[0])); + bsorted = MALLOC(b->count * sizeof(bsorted[0])); + if(!asorted || !bsorted) { + FREEMEM(asorted); + FREEMEM(bsorted); + return -1; + } + + for(idx = 0; idx < a->count; idx++) { + asorted[idx].td = td->elements->type; + asorted[idx].sptr = a->array[idx]; + } + + for(idx = 0; idx < b->count; idx++) { + bsorted[idx].td = td->elements->type; + bsorted[idx].sptr = b->array[idx]; + } + + qsort(asorted, a->count, sizeof(asorted[0]), SET_OF__compare_cb); + qsort(bsorted, b->count, sizeof(bsorted[0]), SET_OF__compare_cb); + + common_length = (a->count < b->count ? a->count : b->count); + for(idx = 0; idx < common_length; idx++) { + int ret = td->elements->type->op->compare_struct( + td->elements->type, asorted[idx].sptr, bsorted[idx].sptr); + if(ret) { + FREEMEM(asorted); + FREEMEM(bsorted); + return ret; + } + } + + FREEMEM(asorted); + FREEMEM(bsorted); + + if(idx < b->count) /* more elements in b */ + return -1; /* a is shorter, so put it first */ + if(idx < a->count) return 1; + } else if(!a) { + return -1; + } else if(!b) { + return 1; + } + + return 0; +} + + +asn_TYPE_operation_t asn_OP_SET_OF = { + SET_OF_free, + SET_OF_print, + SET_OF_compare, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, +#ifdef ASN_DISABLE_OER_SUPPORT + 0, + 0, +#else + SET_OF_decode_oer, + SET_OF_encode_oer, +#endif +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, + 0, + 0, +#else + SET_OF_decode_uper, + SET_OF_encode_uper, + SET_OF_decode_aper, + 0, /* SET_OF_encode_aper */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + SET_OF_random_fill, + 0 /* Use generic outmost tag fetcher */ +}; + + +asn_random_fill_result_t +SET_OF_random_fill(const asn_TYPE_descriptor_t *td, void **sptr, + const asn_encoding_constraints_t *constraints, + size_t max_length) { + const asn_SET_OF_specifics_t *specs = + (const asn_SET_OF_specifics_t *)td->specifics; + asn_random_fill_result_t res_ok = {ARFILL_OK, 0}; + asn_random_fill_result_t result_failed = {ARFILL_FAILED, 0}; + asn_random_fill_result_t result_skipped = {ARFILL_SKIPPED, 0}; + const asn_TYPE_member_t *elm = td->elements; + void *st = *sptr; + long max_elements = 5; + long slb = 0; /* Lower size bound */ + long sub = 0; /* Upper size bound */ + size_t rnd_len; + + if(max_length == 0) return result_skipped; + + if(st == NULL) { + st = (*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) { + return result_failed; + } + } + + switch(asn_random_between(0, 6)) { + case 0: max_elements = 0; break; + case 1: max_elements = 1; break; + case 2: max_elements = 5; break; + case 3: max_elements = max_length; break; + case 4: max_elements = max_length / 2; break; + case 5: max_elements = max_length / 4; break; + default: break; + } + sub = slb + max_elements; + + if(!constraints || !constraints->per_constraints) + constraints = &td->encoding_constraints; + if(constraints->per_constraints) { + const asn_per_constraint_t *pc = &constraints->per_constraints->size; + if(pc->flags & APC_SEMI_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->lower_bound + max_elements; + } else if(pc->flags & APC_CONSTRAINED) { + slb = pc->lower_bound; + sub = pc->upper_bound; + if(sub - slb > max_elements) sub = slb + max_elements; + } + } + + /* Bias towards edges of allowed space */ + switch(asn_random_between(-1, 4)) { + default: + case -1: + /* Prepare lengths somewhat outside of constrained range. */ + if(constraints->per_constraints + && (constraints->per_constraints->size.flags & APC_EXTENSIBLE)) { + switch(asn_random_between(0, 5)) { + default: + case 0: + rnd_len = 0; + break; + case 1: + if(slb > 0) { + rnd_len = slb - 1; + } else { + rnd_len = 0; + } + break; + case 2: + rnd_len = asn_random_between(0, slb); + break; + case 3: + if(sub < (ssize_t)max_length) { + rnd_len = sub + 1; + } else { + rnd_len = max_length; + } + break; + case 4: + if(sub < (ssize_t)max_length) { + rnd_len = asn_random_between(sub + 1, max_length); + } else { + rnd_len = max_length; + } + break; + case 5: + rnd_len = max_length; + break; + } + break; + } + /* Fall through */ + case 0: + rnd_len = asn_random_between(slb, sub); + break; + case 1: + if(slb < sub) { + rnd_len = asn_random_between(slb + 1, sub); + break; + } + /* Fall through */ + case 2: + rnd_len = asn_random_between(slb, slb); + break; + case 3: + if(slb < sub) { + rnd_len = asn_random_between(slb, sub - 1); + break; + } + /* Fall through */ + case 4: + rnd_len = asn_random_between(sub, sub); + break; + } + + for(; rnd_len > 0; rnd_len--) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + void *ptr = 0; + asn_random_fill_result_t tmpres = elm->type->op->random_fill( + elm->type, &ptr, &elm->encoding_constraints, + (max_length > res_ok.length ? max_length - res_ok.length : 0) + / rnd_len); + switch(tmpres.code) { + case ARFILL_OK: + ASN_SET_ADD(list, ptr); + res_ok.length += tmpres.length; + break; + case ARFILL_SKIPPED: + break; + case ARFILL_FAILED: + assert(ptr == 0); + return tmpres; + } + } + + return res_ok; +} + diff --git a/src/codec_utils/E2AP_OLD1/constr_SET_OF.h b/src/codec_utils/E2AP_OLD1/constr_SET_OF.h new file mode 100644 index 000000000..768106271 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SET_OF.h @@ -0,0 +1,49 @@ +/*- + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef CONSTR_SET_OF_H +#define CONSTR_SET_OF_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct asn_SET_OF_specifics_s { + /* + * Target structure description. + */ + unsigned struct_size; /* Size of the target structure. */ + unsigned ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ +} asn_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; +asn_struct_compare_f SET_OF_compare; +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +xer_type_decoder_f SET_OF_decode_xer; +xer_type_encoder_f SET_OF_encode_xer; +oer_type_decoder_f SET_OF_decode_oer; +oer_type_encoder_f SET_OF_encode_oer; +per_type_decoder_f SET_OF_decode_uper; +per_type_encoder_f SET_OF_encode_uper; +per_type_decoder_f SET_OF_decode_aper; +per_type_encoder_f SET_OF_encode_aper; +asn_random_fill_f SET_OF_random_fill; +extern asn_TYPE_operation_t asn_OP_SET_OF; + +#ifdef __cplusplus +} +#endif + +#endif /* CONSTR_SET_OF_H */ diff --git a/src/codec_utils/E2AP_OLD1/constr_SET_OF_oer.c b/src/codec_utils/E2AP_OLD1/constr_SET_OF_oer.c new file mode 100644 index 000000000..520051811 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_SET_OF_oer.c @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2017 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_DISABLE_OER_SUPPORT + +#include +#include +#include +#include + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) \ + do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) \ + do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#undef SET_PHASE +#define SET_PHASE(ctx, value) \ + do { \ + ctx->phase = value; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) \ + do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + return rval; \ + } while(0) + +/* + * The SEQUENCE OF and SET OF values utilize a "quantity field". + * It is is a pointless combination of #8.6 (length determinant, capable + * of encoding tiny and huge numbers in the shortest possible number of octets) + * and the variable sized integer. What could have been encoded by #8.6 alone + * is required to be encoded by #8.6 followed by that number of unsigned octets. + * This doesn't make too much sense. It seems that the original version of OER + * standard have been using the unconstrained unsigned integer as a quantity + * field, and this legacy have gone through ISO/ITU-T standardization process. + */ +static ssize_t +oer_fetch_quantity(const void *ptr, size_t size, size_t *qty_r) { + const uint8_t *b; + const uint8_t *bend; + size_t len = 0; + size_t qty; + + ssize_t len_len = oer_fetch_length(ptr, size, &len); + if(len_len <= 0) { + *qty_r = 0; + return len_len; + } + + if((len_len + len) > size) { + *qty_r = 0; + return 0; + } + + b = (const uint8_t *)ptr + len_len; + bend = b + len; + + /* Skip the leading 0-bytes */ + for(; b < bend && *b == 0; b++) { + } + + if((bend - b) > (ssize_t)sizeof(size_t)) { + /* Length is not representable by the native size_t type */ + *qty_r = 0; + return -1; + } + + for(qty = 0; b < bend; b++) { + qty = (qty << 8) + *b; + } + + if(qty > RSIZE_MAX) { /* A bit of C11 validation */ + *qty_r = 0; + return -1; + } + + *qty_r = qty; + assert((size_t)len_len + len == (size_t)(bend - (const uint8_t *)ptr)); + return len_len + len; +} + +asn_dec_rval_t +SET_OF_decode_oer(const asn_codec_ctx_t *opt_codec_ctx, + const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, void **struct_ptr, + const void *ptr, size_t size) { + const asn_SET_OF_specifics_t *specs = (const asn_SET_OF_specifics_t *)td->specifics; + asn_dec_rval_t rval = {RC_OK, 0}; + void *st = *struct_ptr; /* Target structure */ + asn_struct_ctx_t *ctx; /* Decoder context */ + size_t consumed_myself = 0; /* Consumed bytes from ptr. */ + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously. + */ + switch(ctx->phase) { + case 0: { + /* + * Fetch number of elements to decode. + */ + size_t length = 0; + size_t len_size = oer_fetch_quantity(ptr, size, &length); + switch(len_size) { + case 0: + RETURN(RC_WMORE); + case -1: + RETURN(RC_FAIL); + default: + ADVANCE(len_size); + ctx->left = length; + } + } + NEXT_PHASE(ctx); + /* FALL THROUGH */ + case 1: { + /* Decode components of the extension root */ + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + const void *base_ptr = ptr; + ber_tlv_len_t base_ctx_left = ctx->left; + + assert(td->elements_count == 1); + + ASN_DEBUG("OER SET OF %s Decoding PHASE 1", td->name); + + for(; ctx->left > 0; ctx->left--) { + asn_dec_rval_t rv = elm->type->op->oer_decoder( + opt_codec_ctx, elm->type, + elm->encoding_constraints.oer_constraints, &ctx->ptr, ptr, + size); + ADVANCE(rv.consumed); + switch(rv.code) { + case RC_OK: + if(ASN_SET_ADD(list, ctx->ptr) != 0) { + RETURN(RC_FAIL); + } else { + ctx->ptr = 0; + /* + * This check is to avoid compression bomb with + * specs like SEQUENCE/SET OF NULL which don't + * consume data at all. + */ + if(rv.consumed == 0 && base_ptr == ptr + && (base_ctx_left - ctx->left) > 200) { + ASN__DECODE_FAILED; + } + break; + } + case RC_WMORE: + RETURN(RC_WMORE); + case RC_FAIL: + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + SET_PHASE(ctx, 3); + RETURN(RC_FAIL); + } + } + /* Decoded decently. */ + NEXT_PHASE(ctx); + } + /* Fall through */ + case 2: + /* Ignore fully decoded */ + assert(ctx->left == 0); + RETURN(RC_OK); + case 3: + /* Failed to decode. */ + RETURN(RC_FAIL); + } + + return rval; +} + +static ssize_t +oer_put_quantity(size_t qty, asn_app_consume_bytes_f *cb, void *app_key) { + uint8_t buf[1 + sizeof(size_t)]; + uint8_t *b = &buf[sizeof(size_t)]; /* Last addressable */ + size_t encoded; + + do { + *b-- = qty; + qty >>= 8; + } while(qty); + + *b = sizeof(buf) - (b-buf) - 1; + encoded = sizeof(buf) - (b-buf); + if(cb(b, encoded, app_key) < 0) + return -1; + return encoded; +} + +/* + * Encode as Canonical OER. + */ +asn_enc_rval_t +SET_OF_encode_oer(const asn_TYPE_descriptor_t *td, + const asn_oer_constraints_t *constraints, const void *sptr, + asn_app_consume_bytes_f *cb, void *app_key) { + const asn_TYPE_member_t *elm; + const asn_anonymous_set_ *list; + size_t computed_size = 0; + ssize_t qty_len; + int n; + + (void)constraints; + + if(!sptr) ASN__ENCODE_FAILED; + + elm = td->elements; + list = _A_CSET_FROM_VOID(sptr); + + qty_len = oer_put_quantity(list->count, cb, app_key); + if(qty_len < 0) { + ASN__ENCODE_FAILED; + } + computed_size += qty_len; + + for(n = 0; n < list->count; n++) { + void *memb_ptr = list->array[n]; + asn_enc_rval_t er = {0,0,0}; + er = elm->type->op->oer_encoder( + elm->type, elm->encoding_constraints.oer_constraints, memb_ptr, cb, + app_key); + if(er.encoded < 0) { + return er; + } else { + computed_size += er.encoded; + } + } + + { + asn_enc_rval_t erval = {0,0,0}; + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } +} + +#endif /* ASN_DISABLE_OER_SUPPORT */ diff --git a/src/codec_utils/E2AP_OLD1/constr_TYPE.c b/src/codec_utils/E2AP_OLD1/constr_TYPE.c new file mode 100644 index 000000000..aefaefdb7 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_TYPE.c @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn_TYPE_outmost_tag(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->op->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, const asn_TYPE_descriptor_t *td, + const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->op->print_struct(td, struct_ptr, 1, _print2fp, stream)) { + return -1; + } + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) { + return -1; + } + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} diff --git a/src/codec_utils/E2AP_OLD1/constr_TYPE.h b/src/codec_utils/E2AP_OLD1/constr_TYPE.h new file mode 100644 index 000000000..d80dea5a3 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constr_TYPE.h @@ -0,0 +1,262 @@ +/* + * Copyright (c) 2003-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ + void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ +} asn_struct_ctx_t; + +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#include /* Subtype constraints support */ +#include /* Random structures support */ + +#ifdef ASN_DISABLE_OER_SUPPORT +typedef void (oer_type_decoder_f)(void); +typedef void (oer_type_encoder_f)(void); +typedef void asn_oer_constraints_t; +#else +#include /* Octet Encoding Rules encoder */ +#include /* Octet Encoding Rules encoder */ +#endif + +/* + * Free the structure according to its specification. + * Use one of ASN_STRUCT_{FREE,RESET,CONTENTS_ONLY} macros instead. + * Do not use directly. + */ +enum asn_struct_free_method { + ASFM_FREE_EVERYTHING, /* free(struct_ptr) and underlying members */ + ASFM_FREE_UNDERLYING, /* free underlying members */ + ASFM_FREE_UNDERLYING_AND_RESET /* FREE_UNDERLYING + memset(0) */ +}; +typedef void (asn_struct_free_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, enum asn_struct_free_method); + +/* + * Free the structure including freeing the memory pointed to by ptr itself. + */ +#define ASN_STRUCT_FREE(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_EVERYTHING) + +/* + * Free the memory used by the members of the structure without freeing the + * the structure pointer itself. + * ZERO-OUT the structure to the safe clean state. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + */ +#define ASN_STRUCT_RESET(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING_AND_RESET) + +/* + * Free memory used by the members of the structure without freeing + * the structure pointer itself. + * (Retaining the pointer may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are dynamic.) + * AVOID using it in the application code; + * Use a safer ASN_STRUCT_RESET() instead. + */ +#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ + (asn_DEF).op->free_struct(&(asn_DEF), (ptr), ASFM_FREE_UNDERLYING) + +/* + * Print the structure according to its specification. + */ +typedef int(asn_struct_print_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Compare two structs between each other. + * Returns <0 if struct_A is "smaller" than struct_B, >0 if "greater", + * and =0 if "equal to", for some type-specific, stable definition of + * "smaller", "greater" and "equal to". + */ +typedef int (asn_struct_compare_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_A, + const void *struct_B); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type; used internally. */ +asn_outmost_tag_f asn_TYPE_outmost_tag; + +/* + * Fetch the desired type of the Open Type based on the + * Information Object Set driven constraints. + */ +typedef struct asn_type_selector_result_s { + const struct asn_TYPE_descriptor_s *type_descriptor; /* Type encoded. */ + unsigned presence_index; /* Associated choice variant. */ +} asn_type_selector_result_t; +typedef asn_type_selector_result_t(asn_type_selector_f)( + const struct asn_TYPE_descriptor_s *parent_type_descriptor, + const void *parent_structure_ptr); + +/* + * Generalized functions for dealing with the speciic type. + * May be directly invoked by applications. + */ +typedef struct asn_TYPE_operation_s { + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_struct_compare_f *compare_struct; /* Compare two structures */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + oer_type_decoder_f *oer_decoder; /* Generic OER decoder */ + oer_type_encoder_f *oer_encoder; /* Canonical OER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + per_type_decoder_f *aper_decoder; /* Aligned PER decoder */ + per_type_encoder_f *aper_encoder; /* Aligned PER encoder */ + asn_random_fill_f *random_fill; /* Initialize with a random value */ + asn_outmost_tag_f *outmost_tag; /* */ +} asn_TYPE_operation_t; + +/* + * A constraints tuple specifying both the OER and PER constraints. + */ +typedef struct asn_encoding_constraints_s { + const struct asn_oer_constraints_s *oer_constraints; + const struct asn_per_constraints_s *per_constraints; + asn_constr_check_f *general_constraints; +} asn_encoding_constraints_t; + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn_TYPE_descriptor_s { + const char *name; /* A name of the ASN.1 type. "" in some cases. */ + const char *xml_tag; /* Name used in XML tag */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_TYPE_operation_t *op; + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ + + /* + * Tags that are expected to occur. + */ + const ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ + unsigned tags_count; /* Number of tags which are expected */ + const ber_tlv_tag_t *all_tags; /* Every tag for BER/containment */ + unsigned all_tags_count; /* Number of tags */ + + /* OER, PER, and general constraints */ + asn_encoding_constraints_t encoding_constraints; + + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn_TYPE_member_s *elements; + unsigned elements_count; + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + const void *specifics; +} asn_TYPE_descriptor_t; + +/* + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. + */ + enum asn_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02, /* Open Type */ + ATF_ANY_TYPE = 0x04 /* ANY type (deprecated!) */ + }; +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ + unsigned optional; /* Following optional members, including current */ + unsigned memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_type_selector_f *type_selector; /* IoS runtime type selector */ + asn_encoding_constraints_t encoding_constraints; + int (*default_value_cmp)(const void *sptr); /* Compare DEFAULT */ + int (*default_value_set)(void **sptr); /* Set DEFAULT */ + const char *name; /* ASN.1 identifier of the element */ +} asn_TYPE_member_t; + +/* + * BER tag to element number mapping. + */ +typedef struct asn_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + unsigned el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relative */ +} asn_TYPE_tag2member_t; + +/* + * This function prints out the contents of the target language's structure + * (struct_ptr) into the file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + const asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/src/codec_utils/E2AP_OLD1/constraints.c b/src/codec_utils/E2AP_OLD1/constraints.c new file mode 100644 index 000000000..df3c6c194 --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constraints.c @@ -0,0 +1,93 @@ +#include +#include + +int +asn_generic_no_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *cb, void *key) { + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Unknown how to check */ + return 0; +} + +struct errbufDesc { + const asn_TYPE_descriptor_t *failed_type; + const void *failed_struct_ptr; + char *errbuf; + size_t errlen; +}; + +static void +_asn_i_ctfailcb(void *key, const asn_TYPE_descriptor_t *td, const void *sptr, + const char *fmt, ...) { + struct errbufDesc *arg = key; + va_list ap; + ssize_t vlen; + ssize_t maxlen; + + arg->failed_type = td; + arg->failed_struct_ptr = sptr; + + maxlen = arg->errlen; + if(maxlen <= 0) + return; + + va_start(ap, fmt); + vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); + va_end(ap); + if(vlen >= maxlen) { + arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ + arg->errlen = maxlen - 1; /* Not counting termination */ + return; + } else if(vlen >= 0) { + arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ + arg->errlen = vlen; /* Not counting termination */ + } else { + /* + * The libc on this system is broken. + */ + vlen = sizeof("") - 1; + maxlen--; + arg->errlen = vlen < maxlen ? vlen : maxlen; + memcpy(arg->errbuf, "", arg->errlen); + arg->errbuf[arg->errlen] = 0; + } + + return; +} + +int +asn_check_constraints(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + struct errbufDesc arg; + int ret; + + arg.failed_type = 0; + arg.failed_struct_ptr = 0; + arg.errbuf = errbuf; + arg.errlen = errlen ? *errlen : 0; + + ret = type_descriptor->encoding_constraints.general_constraints( + type_descriptor, struct_ptr, _asn_i_ctfailcb, &arg); + if(ret == -1 && errlen) *errlen = arg.errlen; + + return ret; +} + diff --git a/src/codec_utils/E2AP_OLD1/constraints.h b/src/codec_utils/E2AP_OLD1/constraints.h new file mode 100644 index 000000000..0bd86a96b --- /dev/null +++ b/src/codec_utils/E2AP_OLD1/constraints.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2004-2017 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN1_CONSTRAINTS_VALIDATOR_H +#define ASN1_CONSTRAINTS_VALIDATOR_H + +#include /* Platform-dependent types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + * + * RETURN VALUES: + * This function returns 0 in case all ASN.1 constraints are met + * and -1 if one or more constraints were failed. + */ +int asn_check_constraints( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ +); + + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int(asn_constr_check_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, const void *struct_ptr, + asn_app_constraint_failed_f *optional_callback, /* Log the error */ + void *optional_app_key /* Opaque key passed to a callback */ +); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define ASN__CTFAIL if(ctfailcb) ctfailcb + +#ifdef __cplusplus +} +#endif + +#endif /* ASN1_CONSTRAINTS_VALIDATOR_H */ diff --git a/src/codec_utils/E2AP_OLD1/e2ap b/src/codec_utils/E2AP_OLD1/e2ap new file mode 100644 index 0000000000000000000000000000000000000000..97c6a6f2d5d87de425b8ba18109f6830bd41fe00 GIT binary patch literal 523240 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